大一新生紧急求助,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
...全文
531 5 打赏 收藏 转发到动态 举报
写回复
用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;
}
内容概要:本文介绍了一种基于多目标粒子群算法(MOPSO)的微电网优化调度模型,综合考虑风能、光伏、储能系统、柴油发电机、燃气轮机以及与主电网之间的能量交互等多种分布式能源的协同运行。通过构建以运行成本最小化、碳排放最低化和系统可靠性最优化为目标的多目标优化模型,利用Matlab平台实现MOPSO算法求解,完成对微电网在不同运行场景下的能量管理与调度方案优化。该模型能够有效平衡经济性与环保性之间的关系,适用于含多类型分布式电源的复杂微电网系统,具有较强的工程应用价值和科研参考意义; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事微电网、智能电网、综合能源系统、可再生能源集成与优化调度等领域研究的专业人士; 使用场景及目标:①用于多能源耦合微电网系统的协同优化调度研究;②支持多目标智能优化算法在能源系统中的建模与求解实践,帮助用户掌握MOPSO在实际工程问题中的应用方法;③为学术论文复现、毕业设计、科研项目开发提供完整的代码实例与技术支撑; 阅读建议:建议读者结合Matlab代码与理论文档,深入理解目标函数构建、约束条件处理及Pareto最优解集生成机制,重点关注算法参数设置、多目标权衡分析与结果可视化,并可通过调整能源配置或引入新约束进行二次开发与创新研究。

65,211

社区成员

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

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