YTU OJ-1010: 目标柏林

1010: 目标柏林

Time Limit: 1000 Sec   Memory Limit: 64 MB
Submit: 74   Solved: 33
[ Submit][ Status][ Web Board]

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

import java.util.*;
public class 目标柏林 {
static char[] s=new char[1000];
public static void s(int x,int n) {   //顺时针旋转
char t=s[x*n-1];
for(int i=n*x-1;i>=x;i-=x) {
s[i]=s[i-x];
}
s[x-1]=t;
}
public static void n(int x,int n) {  //逆时针旋转
char t=s[x-1];
for(int i=x-1;i<x*n-1;i+=x) {
s[i]=s[i+x];
}
s[n*x-1]=t;
}
public static int c(int x,int n) {   //统计每个数字的倍数的个数
int count=0;
for(int i=0;i<n;i++){
if((i+1)%x==0) {
count++;
}
}
return count;
}
public static char[] f() {          //总的处理函数
int n=s.length;
for(int i=n-1;i>=0;i--) {
if((i+1)%2==0) {
s(i+1,c((i+1),n));
}else if((i+1)%2!=0) {
n(i+1,c((i+1),n));
}
}
return s;
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String str="";
while(in.hasNext()) {
str=in.nextLine();
s=str.toCharArray();
s=f();
System.out.println(s);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值