R7-10 简单密码构建(pta)

近期校园“电信诈骗案”的一桩连着一桩的发生,让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原题,代码为原创,如有雷同纯属意外,如侵权请告知删除。

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值