题目来源:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6
模拟
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
char ciphertext[80], plaintext[80];
int ciphercode[100], plaincode[100];
int i, k;
while(scanf("%d", &k), k)
{
scanf("%s",ciphertext);
int Len = strlen(ciphertext);
for(i = 0; i < Len; ++i)//求出密文编码
{
if(ciphertext[i] >= 'a' && ciphertext[i] <= 'z')
ciphercode[i] = ciphertext[i] - 96;
else if(ciphertext[i] == '_')
ciphercode[i] = 0;
else
ciphercode[i] = 27;
}
//接下来求解明文编码plaincode[t] = (ciphercode[i] + i) mod 28;其中t = k * i % Len
for(i = 0; i < Len; ++i)
{
int t = k * i % Len;
plaincode[t] = (ciphercode[i] + i) % 28;
}
//接下来根据明文编码,恢复明文
for(i = 0; i < Len ;++i)
{
if(plaincode[i] >= 1 && plaincode[i] <= 26)
plaintext[i] = plaincode[i] + 96;
else if(plaincode[i] == 0)
plaintext[i] = '_';
else
plaintext[i] = '.';
}
plaintext[i] = '\0';
printf("%s\n", plaintext);
}
return 0;
}