【模拟】【乱搞】【AOJ-10】目标柏林

Description
1945年初,苏军和英美联军已从东西两面攻入德国国境。
4月初,在苏军和英美联军的夹击下,德军只能龟缩在以柏林为中心的德国东部的狭长地带,成了瓮中之鳖。
但希特勒困兽犹斗,一方面发出摧毁一切设施,实行“焦土”政策的指令;
另一方面下令把德国分为南北两个行政区,各自作战,他自己则固守柏林。
在这一天,苏军结果一份传自柏林的加密电文。经初步破译,显示希特勒要调集100万兵力,
在柏林周围筑起了三层防卫圈,并集中3300架飞机,1500多辆坦克,1万门火炮和迫击炮,准备死守柏林。
形势很危机,我们需要马上破译所有密码。请你来遍个程序帮忙破译。

苏军知道德军用的加密方法是这样的:
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。

现在给你加密后的文章,让你还原成原来的文章。

 

Input
输入一篇加密后的文章,每行为一段。每段不超过1000个字符。
输入以文件结束(EOF)为止。

 

Output
输出解密后的文章。
每段一行。

 

Sample Input
ecbad

 
Sample Output
abcde
思路:
一个简单的模拟题,我是先写出加密程序,再稍微修改下成解密程序
在读取需要旋转的字符的编号的时候花了不少功夫 一直超时
 
参考代码
#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; 
}

 

posted @ 2013-12-12 17:57  AHU_树  阅读(458)  评论(0编辑  收藏  举报