http://acm.hdu.edu.cn/showproblem.php?pid=1129 解题思路:分析给的转换函数,然后逆推函数即可转换成功。 #include <stdio.h> #include <string.h> #define size 201 char PlainText[size],CipherText[size];//明码,密码 int PlainCode[size],CipherCode[size];//明码相应数值,密码相应数值 int len; int StrToDig(char ch) { if(ch == '_') return 0; else if(ch == '.') return 27; else return ch-'a'+1; } char DigToStr(int dig) { if(dig == 0) return '_'; else if(dig == 27) return '.'; else return dig-1+'a'; } /*密码数字转换成明码数字*/ void CipherCodeToPlainCode(int key) { int i,tem; for (i=0;i<len;i++) { tem = CipherCode[i]+i; while (tem<0||tem>27)/*限定密码值的范围在0-27之间*/ { if(tem<0) tem+=28; else if(tem>27) tem-=28; } PlainCode[(key*i)%len] = tem; } }; int main() { int key,i; while (scanf("%d",&key)&&key) { scanf("%s",CipherText); len = strlen(CipherText); for (i=0;i<len;i++) CipherCode[i] = StrToDig(CipherText[i]); CipherCodeToPlainCode(key); for(i=0;i<len;i++) PlainText[i] = DigToStr(PlainCode[i]); PlainText[len] = '/0'; printf("%s/n",PlainText); } return 0; }