首页 > 代码库 > 目标柏林

目标柏林

题目描述

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。
现在给你加密后的文章,让你还原成原来的文章。

输入要求

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

输出要求

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

假如输入

ecbad

应当输出

abcde

提示

C and C++ language can use :



char input[1001];

while(gets(input))

{

	...

}
#include<iostream>
#include<algorithm>
#include <vector>
#include<string.h>
#include<ctype.h>
using namespace std;
void fun();
int main()
{
	fun();
	return 0;
}
void fun()
{
	char str[1001],str0,str1;
	int arr[1001];
	int i;
	while(gets(str))
	{		
		for(i=strlen(str)/2;i>1;i--)//只需算一半即可,1的也不用算
		{
			int temp=1;
			if(i%2==1)//逆序,也就是数组前移
			{					
				str0=str[i-1];
				while(i*(temp+1)<=strlen(str))
				{
					str[i*temp-1]=str[i*(temp+1)-1];
					temp++;
				}
				str[i*temp-1]=str0;				
			}
			else//顺序,数组后移
			{
				str0=str[i-1];
				while(i*(temp+1)<=strlen(str))
				{
					str1=str[i*(temp+1)-1];
					str[i*(temp+1)-1]=str0;
					str0=str1;
					temp++;
				}
				str[i-1]=str1;
			}
		}		
		for(i=1;i<strlen(str);i++)
			cout<<str[i];
		cout<<str[0]<<endl;
	}
}




目标柏林