每日编程中遇到任何疑问、意见、建议请公众号留言或加入每日编程群聊739635399
解密——加密的算法是26个英文字母,向后移三位为密文(a加密为d…最后x->a;y->b;z->c)有大小写。输入密文,计算明文。
输入格式:
输入密文
输出格式:
输出明文输入样例:
An asdwa lijxa
输出样例:
Xk xpatx ifgux
解决方法:
(1)算法的基本思想:
难点在于处于边界处的字母进行加密解密。
对于普通的字母char,加密:char+3,解密:char-3
处于边界处的,如x,加密:x->a,我们可以采取取余的方法,构成环
(x+3)%26 -> a
但解密时,a->x,a-3不在范围内了,需要再补上26
(a-3+26)%26 -> x
对于所有的char,我们都可以,加密:(char+3)%26
解密:(char-3+26)%26
(2)代码实现:
#include <iostream>
using namespace std;
bool isCharacter(char c); //检查是否是字母
bool isUpper(char c); //检查是否是大写字母
char encode(char c); //加密字母c
char decode(char c); //解密字母c
int main(void)
{
char code[100];
cout << "输入密文:" << endl;
//cin >> code;
cin.getline(code, 100);
cout << "明文为:" << endl;
int i = 0;
while (code[i] != '\0')
{
cout << decode(code[i]);
i++;
}
cout << endl;
return 0;
}
bool isCharacter(char c)
{
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
{
return true;
}
return false;
}
bool isUpper(char c)
{ //检查是否是大写字母
if (c >= 'A' && c <= 'Z')
{
return true;
}
return false;
}
char encode(char c)
{
if (!isCharacter(c))
return c; //非字母字符直接返回
char result;
if (isUpper(c))
{ //c是大写字母
result = (c - 'A' + 3) % 26 + 'A';
}
else
{
result = (c - 'a' + 3) % 26 + 'a'; //先c-'a'转换成整数做加密取余运算,再+'a'转换成字母
}
return result;
}
char decode(char c)
{
if (!isCharacter(c))
return c; //非字母字符直接返回
char result;
if (isUpper(c))
{ //c是大写字母
result = (c - 'A' - 3 + 26) % 26 + 'A';
}
else
{
result = (c - 'a' - 3 + 26) % 26 + 'a';
}
return result;
}
1-20号牌,输入牌的数目,以及每张牌的编号。只有三张连续的牌可以兑换一张新牌,新牌不能参与兑换。编程实现计算可兑换的牌数。
输入格式:
输入牌的数量
输入牌的编号
输出格式:
能兑换的牌的数量输入样例:
10
1 1 2 2 3 5 5 6 7 9
输出样例:
2