UP今天考试,GESP-三级。
发现试卷贼难(哭)
第二题没做出来。
看在UP可怜的份上,多关注,多收藏,万分感谢!
所有题目均为回忆,大致意思相同即可
题目一:顺移字符串
输入一个整数n,输出大写字母表ABCDEFGHIJKLMNOPQRSTUVWXYZ顺移n位的值。
1<=n<=100
N=3;
‘A’--->'D'
'B'--->'E'
'Z'--->'C'
.......
那么,如何写呢?
众所周知‘A’+3='A'的ASCII(65)+3='A’的后三位=‘D’
因此可先这么写:
char a[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int n,i;
cin>>n;
for(i=0;i<26;i++)
{
a[i]+=n;
cout<<a[i];
}
但是,当你输入任何一个数时。
'Z'会有大问题。
有同学问了“什么问题?”
输出结果如下:DEFG.......Z[\]
????
为什么会这样?
因为‘Z’+3=']'
那如何解决呢?
减去一个字母表的长度即可。
char a[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int n,i;
cin>>n;
for(i=0;i<26;i++)
{
a[i]+=n;
if(a[i]>90)
{
a[i]-=26;
}
cout<<a[i];
}
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main( )
{
char a[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int n,i;
cin>>n;
for(i=0;i<26;i++)
{
a[i]+=n;
if(a[i]>90)
{
a[i]-=26;
}
cout<<a[i];
}
return 0;
}
优化,改进:
当输入一个26的两倍以上的数的话,程序会出现以下情况:
蘇唼勥......(乱码)
因此可以将其除掉26之后再计算。
完整代码如下:
#include <bits/stdc++.h>
using namespace std;
int main( )
{
char a[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int n,i;
cin>>n;
n/=26;
for(i=0;i<26;i++)
{
a[i]+=n;
if(a[i]>90)
{
a[i]-=26;
}
cout<<a[i];
}
return 0;
}
你学废了吗??
点赞+关注过15更第二道编程题!
拜拜