一、P1914小书童——凯撒密码
重点是如何实现字母的“循环”
看大佬的题解,收获如下:
1.整除法——最有效简短的方法
(word[j]-'a'+n)%26+'a'
该方法可以这么理解
假设有这样的字符串:
abcd.....abcd.....abcd....
则word[j]+n即为上面字符串中的某个字母,减去'a'即为到第一个字母的距离,而整除26就会计算出word[j]到离它最近的'a'的距离,最后加上'a'即可
2.模拟循环法——直接可观
该方法主要思路是超过'z'就赋值'a',相当于回到了开头,这种思路最好理解,但是时间复杂度与其它方法比较高
大佬的代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s;
int n,i,j;
cin>>n;
cin>>s;
for(i=0;i<s.size();++i)
{
for(j=1;j<=n;++j)
{
++s[i];
if(s[i]>'z')
s[i]='a'; //大于就返回
}
}
cout<<s;
return 0;
}
3.更暴力直接的解法——列出字母表
#include<bits/stdc++.h>
using namespace std;
string a,zi("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
int main()
{
int n;
cin>>n>>a;
for(int i=0;i<=a.length()-1;i++)
cout<<zi[zi.find(a[i])+n];
return 0;
}
缺点:当n很大时,这种方法就不能用了