为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
输入格式:
输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。
输出格式:
输出加密后的结果字符串。
样例1">输入样例1:
Hello Hangzhou
2
输出样例1:
Jgnnq Jcpibjqw
输入样例2:
a=x+y
-1
输出样例2:
z=w+x
***********************************************
下面是代码~~~~~~~
#include<iostream>
using namespace std;
#include<string>
#include<cstring>
#include<iomanip>
int main() {
//输入第一行字符串
char arr[100];
cin.getline(arr, 255);
//输入整数offset
int offset;
cin >> offset;
//对26取余至关重要,当offset的值大于128时,超过了char所能代表的范围(-128~127),此时就会报错,
offset = offset % 26;
char* p = arr;
int len = strlen(arr);
for (int i = 0; i < len; i++) {
//首先判断第i个字符是否为大小写字母
if ((*p >= 65 && *p <= 90) || (*p >= 97 && *p <= 122)) {
if ( ( (*p + offset > 90) && (*p <= 90) ) || ( (*p <= 122) && (*p + offset > 122) ) ) {
char x = *p;
x = x - 26 + offset;
*p = x;
}
else if ( ( (*p >= 65) && (*p + offset < 65) ) || ( (*p >= 97) && (*p + offset < 97) ) ) {
char x = *p;
x = x + 26 + offset;
*p = x;
}
else {
char x = *p;
x += offset;
*p = x;
}
}
p++;
}
cout << arr;
return 0;
}
****************************************************
总结:
前几次失败的测试点是因为没有实现
offset = offset%26这一步,这一步至关重要
原因是char类型所表示的范围是-128~127,当offset输入超过127时,就会溢出从而得不到目标字符,也可以通过将char类型转换为unsigned来实现