POJ1107Ws Cipher【字符密码】

题目链接:

?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;}

待人对事不要太计较,如果太计较就会有悔恨!

POJ1107Ws Cipher【字符密码】

相关文章:

你感兴趣的文章:

标签云: