我为ceasar密码编写代码,但在某些输入中给出了错误的答案。我怀疑加法后的ASCII值是否为负值。请帮忙。
int main() {
int N,k,i=0;
string s;
cin >> N;
cin >> s;
cin >> k;
if(N < 1 || N > 100 || k >100 || k < 0)
return 0;
if(k >= 26 )
k = k%26;
for(i=0;i<N;i++)
{
if(s[i] >= 65 && s[i] <= 90)
{
s[i] += k;
if(s[i] > 90)
s[i] -= 26;
}
if(s[i] >= 97 && s[i] <= 122)
{
s[i] += k;
if(s[i] > 122 )
s[i] -= 26;
}
}
cout << s;
return 0;
}
输入:
10
www.abc.xy
87
预期产出:
fff.jkl.gh
我的输出:
.jkl.
答案 0 :(得分:1)
在小写字母的部分
if(s[i] >= 97 && s[i] <= 122)
{
s[i] += k;
if(s[i] > 122 )
s[i] -= 26;
}
你有溢出问题(可能)。首先转换char 到0到26之间的东西,并在应用凯撒之后,还原它:
if(s[i] >= 'a' && s[i] <= 'z')
{
s[i] -= 'a';
s[i] += k;
s[i] %= 26;
s[i] += 'a';
}
类似于大写字母。
除此之外:
您应该使用s.length()
而不是让用户决定N是什么
如果k为负,会发生什么?
Btw。,Arithm e tic和C ae s a r。
答案 1 :(得分:-1)
问题仅出在ASCII - CHAR转换
这肯定有用
int N,k,i=0;
string s;
cin >> N;
cin >> s;
cin >> k;
if(N < 1 || N > 100 || k >100 || k < 0)
return 0;
if(k >= 26 )
{
k = k%26;
}
for(i=0;i<N;i++)
{
if(s[i] >= 65 && s[i] <= 90)
{ int t=(int)s[i];
t += k;
if(t > 90)
t -= 26;
s[i]=(char)t;
}
if(s[i] >= 97 && s[i] <= 122)
{
int t=(int)s[i];
t+=k;
if(t>122)
t-=26;
s[i]=(char)t;
}
}
cout << s;
return 0;