运用此公式:
ccode[i] = (pcode[ k * i % n ] - i ) % 28
推出:
pcode[ k * i % n ] = ( ccode[i] + i ) % 28.
#include<stdio.h> #include<string.h> int char_int(char c) { if(c=='_') return 0; if(c=='.') return 27; if(c>='a'&&c<='z') return c-'a'+1; } int int_int(int _k,int _i,int _len,int _ccode) { return (_ccode + _i < 28)? _ccode + _i: (_ccode + _i)%28; //此处原来错写成(_ccode + _i)-28
//其实这句语句可以写成 return (_ccode + _i)%28;(省去了判断) } int main() { const char ptext[29]={"_abcdefghijklmnopqrstuvwxyz."}; int i,k,len,ccode[80],pcode[30]; char ctext[80]; while(scanf("%d",&k)!=EOF,k) { scanf("%s",ctext); len=strlen(ctext); for(i=0;i<len;i++) { ccode[i]=char_int(ctext[i]); pcode[(k*i)%len]=int_int(k,i,len,ccode[i]); } for(i=0;i<len;i++) printf("%c",ptext[pcode[i]]); printf("/n"); } return 0; }