1010: 目标柏林
时间限制: 1000 Sec 内存限制: 64 MB提交: 32 解决: 15
题目描述

苏军知道德军用的加密方法是这样的: 1.获得一段文字后,求出它的长度(包括空格)len。 2.进入加密运算的第1步:把所有下标是1倍数的字符做顺时针旋转。 3.进入加密运算的第2步:把所有下标是2倍数的字符做逆时针旋转。 4.进入加密运算的第3步:把所有下标是3倍数的字符做顺时针旋转。 5.按上面的规则,第奇数步按顺时针旋转,偶数步按逆时针旋转,一直到第len步为止。
比如原文是:abcde 1.获得长度len = 5 2.1的倍数有1、2、3、4、5,所以把这5个字符按顺时针旋转,得到eabcd。 3.2的倍数有2、4,所以把这2个字符按逆时针旋转,得到ecbad。 4.3的倍数有3,所以把这1个字符按顺时针旋转,得到ecbad。 5.4的倍数有4,所以把这1个字符按逆时针旋转,得到ecbad。 6.5的倍数有5,所以把这1个字符按顺时针旋转,得到ecbad。 最后的结果是ecbad。
现在给你加密后的文章,让你还原成原来的文章。
输入
输入一篇加密后的文章,每行为一段。每段不超过1000个字符。 输入以文件结束(EOF)为止。
输出
输出解密后的文章。 每段一行。
样例输入
ecbad
样例输出
abcde
提示
C and C++ language can use :char input[1001];while(gets(input)){...}报告参见http://acm.zjgsu.edu.cn/Report/1009/1009.html
你 离 开 了 , 我 的 世 界 里 只 剩 下 雨 。 。 。
#include <stdio.h>
#include <string.h>
#define LEN 1000+10
void turn_right(char *c,int *a,int k)
{int i;char temp;temp=c[a[k-1]];for(i=0;i<k-1;i++)c[a[k-1-i]]=c[a[k-2-i]];c[a[0]]=temp;
}
void turn_left(char *c,int *a,int k)
{int i;char temp;temp=c[a[0]];for(i=0;i<k-1;i++)c[a[i]]=c[a[i+1]];c[a[k-1]]=temp;
}
int main()
{char c[LEN];int a[LEN]={0};int len;int i,j,k=0;while(gets(c)){len=strlen(c);for(i=len;i>=1;i--){k=0;memset(a,0,sizeof(a));for(j=i;j<=len;j+=i)a[k++]=j-1;if(k==1)continue;if(i%2==0)turn_right(c,a,k);else turn_left(c,a,k);}puts(c);}return 0;
}