思路:
- 密钥不区分大小写,转换成其在字母表中的位置(0-25)
- 每次读入1个密文字符,直至换行
- 密文减去转换后的密钥
- 如果小于'A',或小于'a'并且原先是小写,加上26
#3 #5 #8 AC 其余WA
代码(⚠码风不良⚠):
#include<cstdio>
using namespace std;
void jiemi(char c);
char key[101];
unsigned short k=0;
int main()
{
scanf("%s",key);
unsigned short i=0;
char ch=key[0],in;
while(ch!='\0')
{
if(ch<'a')key[i]=ch-'A';
else key[i]=ch-'a';
ch=key[++i];
} //转换密钥
getchar();in=getchar();
while(in!='\n')
{
jiemi(in); //解密
in=getchar();
}
}
void jiemi(char c)
{
bool small;
if(c<'a')small=false;
else small=true;
if(key[k]=='\0')k=0;//循环使用密钥
char m=c-key[k++];//密文减密钥
if(m<'A' || m<'a' && small)m+=26;//是否超出字母范围(1.1.)
printf("%c",m);
}
(没毛病啊……)
(一看就会,一写就错)