大一新生紧急求助,zjw系列之简单密码

weixin_52795431 2021-02-04 05:32:04
7-16 ZJW系列之简单密码 (10 分)
,ZJW自己设计了一个程序,这个程序的任务就是将一串拼音字母转换为6位数字(密码)。

ZJW可以使用任何好记的拼音串(比如名字,钟佳闱,就写:zhongjiawei)作为输入,最后输出6位数字。

程序变换过程如下: 第一步:把拼音串6个一组折叠起来,比如zhongjiawei则变为: zhongj iawei

第二步:把所有垂直在同一位置的字符的ascll码值相加,得出6个数字,如上面的例子,则得出:

227 201 230 211 208 106

第三步:对每个数字处理,就是把每个位的数字相加,得出的如果不是一个一位数,那么继续处理,直到变成一位。 例如:227 => 2+2+7=11 => 1+1=2

经过以上三步之后,得到的密码为:235417。这就是ZJW最后的银行卡密码

输入格式:
第一行输入一个T(0 < T < 100),表示测试数据组数 每组数据占一行,代表给定的拼音串,长度不超过20,保证都是小写英文

输出格式:
ZJW最后的银行卡密码,一组数据占一行

输入样例:
在这里给出一组输入。例如:

2
zhongjiawei
haohaoxuexi
输出样例:
在这里给出相应的输出。例如:

235417
875843
...全文
448 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
 司  2021-02-20
  • 打赏
  • 举报
回复
引用 1 楼 xian0-666 的回复:
你们大一就写这种了?难度倒是不大,不过写的头疼
const int MAX = 100;
const int LENTH = 20;
char num[4][6] = {0};
int m[6] = {0};
int m_deal[6] = {0};
int asccii()
{
	for(int j = 0;j < 6; j++)
	{
		int mo = 0;
		for(int k = 0;k < 4; k++)
		{
			mo += (int)num[k][j];
		}
		m[j] = mo;
	}
	return 0;
}
int deal()
{		
	int a,b,c,d,e;	//个十百\个十
	for(int j = 0;j < 6; j++)
	{
		if(m[j] >= 100)
		{
			c = m[j] / 100;
			a = m[j] % 10;
			b = (m[j] / 10) % 10;
			//三位数相加的范围是0-27,所以继续处理
			if(a + b + c < 10)
			{
				m_deal[j] = a + b + c;
			}
			else	//>=10
			{
				d = (a + b + c) % 10;
				e = (a + b + c) / 10;
				if(d + e < 10)
				{
					m_deal[j] = d + e;
				}
				else	//唯一一种不为10就是为19,1+9=10,1+0=1
				{
					m_deal[j] = 1;
				}
			}
		}
		else	//<100
		{
			d = m[j] % 10;
			e = m[j] / 10;
			if(d + e < 10)
			{
				m_deal[j] = d + e;
			}
			else	//唯一一种不为10就是为19,1+9=10,1+0=1
			{
				m_deal[j] = 1;
			}
		}
	}
	return 0;
}
int main(int argc, _TCHAR* argv[])
{
	int No;
	char no[LENTH] = {0}; 
	printf("请输入数据个数:\n");
	scanf("%d",&No);

	for(int i = 0; i < No; i++)
	{
		char num_1[6] ={0};		//叠加后的字符串
		printf("请输入第%d个字符串:\n",i+1);
		scanf("%s",no);
		int n = 0;
		for(int j = 0;j < 4; j++)
		{
			int m = 0;	
			while(m < 6)
			{
				num[j][m] = no[n];
				m++;
				n++;
				if(n >= 20)		//防止数组越界
					break;
			}
		}
		//test
		//for(int i = 0;i < 4; i++)
		//{
		//	for(int j = 0;j < 6; j++)
		//		printf("%c",num[i][j]);
		//}
		asccii();
		deal();
//		test
		//for(int j = 0;j < 6; j++)
		//{
		//	printf("%d\n",m_deal[j]);
		//}
		for(int j = 0;j < 6; j++)
		{
			printf("%d",m_deal[j]);
		}
		printf("\n");

		//小写字符ASCII码97-122,所以加起来的ASCII码的范围为97-122*4,即三位或2位

	}
	return 0;
}
厉害 大佬
  • 打赏
  • 举报
回复
可以i简单一些:

#include <stdio.h>

int main()
{
for (int T = 0, i = 0, j, k[6]; !T && ~scanf("%d", &T);)
for (unsigned char s[24] = {0}; i < T && ~scanf("%24s", s); i++)
{
for (j = 0; j < 6; j++)
k[j] = s[j] + s[j + 6] + s[j + 12] + s[j + 18];
for (j = 0; j < 6; j++)
while (k[j] > 9) k[j] = k[j] / 100 + k[j] % 100 / 10 + k[j] % 10;
printf("%d%d%d%d%d%d\n", k[0], k[1], k[2], k[3], k[4], k[5]);
}

return 0;
}

大一躺平 2023-02-20
  • 举报
回复
@日立奔腾浪潮微软松下联想 这个的思路是什么啊 有点看不太懂
xian0-666 2021-02-05
  • 打赏
  • 举报
回复
怎么你这么多问题,要考试了?
xian0-666 2021-02-05
  • 打赏
  • 举报
回复
你们大一就写这种了?难度倒是不大,不过写的头疼
const int MAX = 100;
const int LENTH = 20;
char num[4][6] = {0};
int m[6] = {0};
int m_deal[6] = {0};
int asccii()
{
	for(int j = 0;j < 6; j++)
	{
		int mo = 0;
		for(int k = 0;k < 4; k++)
		{
			mo += (int)num[k][j];
		}
		m[j] = mo;
	}
	return 0;
}
int deal()
{		
	int a,b,c,d,e;	//个十百\个十
	for(int j = 0;j < 6; j++)
	{
		if(m[j] >= 100)
		{
			c = m[j] / 100;
			a = m[j] % 10;
			b = (m[j] / 10) % 10;
			//三位数相加的范围是0-27,所以继续处理
			if(a + b + c < 10)
			{
				m_deal[j] = a + b + c;
			}
			else	//>=10
			{
				d = (a + b + c) % 10;
				e = (a + b + c) / 10;
				if(d + e < 10)
				{
					m_deal[j] = d + e;
				}
				else	//唯一一种不为10就是为19,1+9=10,1+0=1
				{
					m_deal[j] = 1;
				}
			}
		}
		else	//<100
		{
			d = m[j] % 10;
			e = m[j] / 10;
			if(d + e < 10)
			{
				m_deal[j] = d + e;
			}
			else	//唯一一种不为10就是为19,1+9=10,1+0=1
			{
				m_deal[j] = 1;
			}
		}
	}
	return 0;
}
int main(int argc, _TCHAR* argv[])
{
	int No;
	char no[LENTH] = {0}; 
	printf("请输入数据个数:\n");
	scanf("%d",&No);

	for(int i = 0; i < No; i++)
	{
		char num_1[6] ={0};		//叠加后的字符串
		printf("请输入第%d个字符串:\n",i+1);
		scanf("%s",no);
		int n = 0;
		for(int j = 0;j < 4; j++)
		{
			int m = 0;	
			while(m < 6)
			{
				num[j][m] = no[n];
				m++;
				n++;
				if(n >= 20)		//防止数组越界
					break;
			}
		}
		//test
		//for(int i = 0;i < 4; i++)
		//{
		//	for(int j = 0;j < 6; j++)
		//		printf("%c",num[i][j]);
		//}
		asccii();
		deal();
//		test
		//for(int j = 0;j < 6; j++)
		//{
		//	printf("%d\n",m_deal[j]);
		//}
		for(int j = 0;j < 6; j++)
		{
			printf("%d",m_deal[j]);
		}
		printf("\n");

		//小写字符ASCII码97-122,所以加起来的ASCII码的范围为97-122*4,即三位或2位

	}
	return 0;
}

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧