把加密的过程倒过来做一遍。
对于类似与a = (b - c) % d的情况,不用担心取模的影响,就像一般的式子一样移项就行:b = (a + c ) % d , c = ( b - a ) % d。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char plaintext[100],ciphertext[100];
int plaincode[100],ciphercode[100];
int k;
void ChengeCode()
{
int len = strlen(ciphertext);
for (int i=0; i<len; i++)
switch (ciphertext[i])
{
case '_':ciphercode[i] = 0;break;
case '.':ciphercode[i] = 27;break;
default :ciphercode[i] = ciphertext[i] - 'a' + 1;
}
}
void ChengeText()
{
int len = strlen(ciphertext);
for (int i=0; i<len; i++)
switch (plaincode[i])
{
case 0:plaintext[i] = '_';break;
case 27:plaintext[i] = '.';break;
default :plaintext[i] = plaincode[i] + 'a' - 1;
}
}
void Code()
{
int len = strlen(ciphertext);
for (int i=0; i<len; i++)
{
int t = k * i % len;
plaincode[t] = (ciphercode[i] + i) % 28;
}
}
int main()
{
while (scanf("%d",&k) && k != 0)
{
scanf("%s",ciphertext);
memset(plaintext,0,sizeof(plaintext));
memset(plaincode,0,sizeof(plaincode));
memset(ciphercode,0,sizeof(ciphercode));
ChengeCode();
Code();
ChengeText();
printf("%s\n",plaintext);
}
}