凯撒密码最佳的解法就是用指针位移进行求解
这是后面在路上想到的
解法:
就是生成一个a到z的
最初的做法:
就是也是生成一个a到z序列,然后进行向后移动,生成解密序列,然后通过a[b[i]-'a']
运算出要在a数组中要寻找的位置,然后进行直接查找
缺点:对于大于26的数超出边界之后找出一个符合的表达式,容易在z的特判中算出负数
容易在a到y中大的数中超出边界,不好判断是否符合情况,容易思维混乱
对:不仅仅是数学题的解答,还有编程题的解答,都很注重一点,就是:思维一定不要混乱,在开始时可能会想到一个不是最有的想法,在实现的过程中会多次的遇到bug,因为对于这种解法很容易会漏想到条件,如果发现自己在解答的过程中发现加的判断越来越多,程序的逻辑越来与复杂就不要继续写下去了,最好换个思路或者想办法在最基础的一个点上进行优化。
#include<cstdio>
#include<cstring>
char a[26];
char b[55];
int main()
{
int n=0;
//int h=0;
scanf("%d",&n);
for(int i=0;i<25;i++)
{
int u=i+n;
if(u>26)
{//只要对于超出边界的情况的都要进行取模操作
u%=26;//对于一个处于后面的字符,如果再向后面逐个位移,很容易移动的超出边界
}
a[i]='a'+ u;
}
if(n>26){
n%=26;//对于一个很大的数,如果想要把他转换成对应的小于某个上界的数,比如向后移动26位就相当于没有向后移动,对于向后移动27位就相当于向后移动1位。
//可见对于一个递增的数,我们要将其转换成一个周期性对应的数,这种情况下,我们就比较建议使用取模进行运算,而不是使用循环的使用减法进行减到小于26的数
}
a[26]='z'-(26-(n-1));
// printf("%d",n);
scanf("%s",b);
for(int i=0;i<strlen(b);i++)
{
//printf("%c",b[i]);
printf("%c",a[b[i]-'a']);
}
return 0;
}
标签:26,边界,对于,int,密码,详解,移动,凯撒
From: https://www.cnblogs.com/E-Sheep/p/16871885.html