近期校园“电信诈骗案”的一桩连着一桩的发生,让FJ对自己的银行账户提了个心,为了防止这类事情发生在自己身上,决定给银行卡设计一个密码,可是FJ却遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不是很安全;如果设置不好记的密码,又担心自己会忘记;如果写在纸上呢?又怕纸被人发现或者弄丢……
在一番绞尽脑汁之后,FJ自己设计了一个程序,这个程序的任务就是将一串拼音字母转换为6位数字(密码)。
FJ可以使用任何好记的拼音串(比如名字,钟佳闱,就写:zhongjiawei)作为输入,最后输出6位数字。
程序变换过程如下: 第一步:把拼音串6个一组折叠起来,比如zhongjiawei则变为: zhongj iawei
第二步:把所有垂直在同一位置的字符的ascll码值相加,得出6个数字,如上面的例子,z(122)与i(105)、h(104)与a(97)、o(111)与w(119)、n(110)与e(101)、g(103)与i(105)分别相加,j(106)没有字母与之相对,保持不变,则得出的6个数为:
227 201 230 211 208 106
第三步:对每个数字处理,就是把每个位的数字相加,得出的如果不是一个一位数,那么继续处理,直到变成一位。 例如:227 => 2+2+7=11 => 1+1=2
经过以上三步之后,得到的密码为:235417。这就是FJ最后的银行卡密码
输入格式:
第一行输入一个T(0 < T < 100),表示测试数据组数 每组数据占一行,代表给定的拼音串,长度不超过40,保证都是小写英文。
输出格式:
最后的银行卡密码,一组数据占一行。
输入样例:
2
zhongjiawei
haohaoxuexi
输出样例:
235417
875843
代码:
#include<stdio.h>
#include<string.h>
int dhy(int x);
int main(){
int n,k,t,len,b[6];//利用b数组分个组
scanf("%d",&n);
char a[n][100];
for(int i=0;i<n;i++)
scanf("%s",a[i]);
for(int m=0;m<n;m++){
b[0]=b[1]=b[2]=b[3]=b[4]=b[5]=0;//对于每串字符串b数组要重置
len=strlen(a[m]);
for(int i=0;i<len;i++){
k=i%6;//k实现0到5的循环,如0,1,2,3,4,5,0,1...
b[k]+=a[m][i];//利用b数组将a【m】数组分成六个组,实现第二步
}
for(int i=0;i<6;i++){
while(b[i]>9){
t=b[i];
b[i]=dhy(t);
}
}
for(int i=0;i<6;i++){
printf("%d",b[i]);
}
if(m!=n-1)printf("\n");
}
}
int dhy(int x){//实现第三步
int sum=0;
while(x/10>0){
sum+=x%10;
x/=10;
}
sum+=x;
return sum;
}
注:题目为pta原题,代码为原创,如有雷同纯属意外,如侵权请告知删除。