zl程序教程

您现在的位置是:首页 >  前端

当前栏目

每个字符向后移动x位的循环加密解析

字符循环加密 解析 移动 每个
2023-09-27 14:22:48 时间

题目要求:

在这里插入图片描述

问题解析:

之前学习数据结构中的循环队列,对循环这个概念的理解就不是很深刻,我记得当时的插入位置是判定是否为满((rear+1)%capacity==front)之后,index = (rear+1)%capacity 这样操作的; %这一下防止数组越界的操作,很巧妙的能把rear指针搬回数组开头!
在这里插入图片描述

这里的rear+1 表示我们放数据的逻辑是在队尾rear有效数据挨着的后面一个位置放,连续的放,上面的字符加密可能一次跳好几个单位!

上面这道题既然要循环,肯定就是类似的溢出%操作的逻辑,但是他是在ascii码对应的字符区间,下标并不是简单地0~capacity-1的数组区间映射了;

一次跳5个单位,并且capacity == 26,那么可以理解为:

i加密 = (s[i]-‘A’+5)%capacity+‘A’;

(上面循环队列为啥没有-'A’和后面的+‘A’是因为他的index偏移反问就是0~capacity-1这个范围,所以不用处理,我们这个字符加密,他的范围有个偏移量,是’A’~‘Z’…,他的开头相当于是’A’这个字符ascii码,我们每次处理先把偏移位置-'A’到0,再%capacity类似于循环队列的简单计算方式处理完index偏移位置之后,最终加回来这个起始偏移量’A’即可)

题目代码:

int main(void)

{
	char t;

	printf("请输入若干字符,以回车结束:");

	t = getchar();

	printf("密文为:");

	while (t != '\n')
	{

		if (t <= 'Z' && t >= 'A')
		{
			t = (t - 'A' + 5) % 26 + 'A';//大写字母循环加密
			putchar(t);
		}

		else if (t <= 'z' && t >= 'a')
		{
			t = (t - 'a' + 5) % 26 + 'a';//小写字母类似
			putchar(t);
		}
		t = getchar();
	}

	return 0;

}

运行结果:

在这里插入图片描述