题目链接:
http://poj.org/problem?id=1107
题目大意:
高级加密标准需要用到三个整数k1、k2、k3,然后把26个英文字母分为三组,字符[a~i]为一组,字符
[j~r]是第二组,其他字符[s~z]和下划线_组成第三组。在信息中属于每组的字符,在加密的时候,都被
循环的向左移ki个位置。每组的字符只在自己组中的字符构成的字符串中移动。现在给你加密过后的消
息,请输出原文信息。
思路:
解密的过程其实就是信息中属于每组的字符,都循环的向右移ki个位置。用字符数组s[]来存储加密信息,
s1[]来保存解密后的信息。统计每组字符的个数numi,如果不为0,就将他们右移ki%numi个位置,然后
存入s1[]数组中,最后输出s1[]。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; char s[110],s1[110]; int num[110]; void Rotate(int i,int k,int len) { int no = 0,j = i; while(no != k) { j++; if(j > len-1) j = 0; if(num[j] == num[i]) no++; } s1[j] = s[i]; } int main() { int k1,k2,k3,num1,num2,num3; while(~scanf("%d%d%d",&k1,&k2,&k3) && (k1||k2||k3)) { scanf("%s",s); int len = strlen(s); memset(num,0,sizeof(num)); memset(s1,0,sizeof(s1)); num1 = num2 = num3 = 0; for(int i = 0; i < len; ++i) { if(s[i]>='a' && s[i]<='i') { num1++; num[i] = 1; } else if(s[i]>='j' && s[i]<='r') { num2++; num[i] = 2; } else { num3++; num[i] = 3; } } for(int i = 0; i < len; ++i) { if(num[i] == 1) { if(num1 != 0) Rotate(i,k1%num1,len); } else if(num[i] == 2) { if(num2 != 0) Rotate(i,k2%num2,len); } else { if(num3 != 0) Rotate(i,k3%num3,len); } } s1[len] = '\0'; printf("%s\n",s1); } return 0; }
原文:http://blog.csdn.net/lianai911/article/details/44679671