7-7 又一个密码破译问题(JAVA)

代号008的特工James Leaves截获了一些敌国的密文,经过一段时间的破译,Leaves终于弄清了密文的加密方式。敌国会先对明文进行一次恺撒加密,得到中间密文,再对中间密文进行一次栅栏加密,得到最终密文。
两种加密方式解释如下:
恺撒加密方式:将明文中的所有字母都在字母表上向后偏移x位,得到密文。当x为1时,a变成b,b变成c……z变成a。例如:明文为"winterzzl",x为2时,将明文中的所有字母向后偏移2位,加密后的结果为"ykpvgtbbn"。
栅栏加密方式:将明文平分为2组,先取每组的第1个字母,再取每组的第2个字母……直到取完为止。若明文无法被平分,则第1组比第2组多1个字母。例如:明文为"tokitsukaze",将明文平分为2组,分别为"tokits"和"ukaze",按顺序取完后的结果为"tuokkaiztes"。
Leaves将最终密文和恺撒加密的偏移量x给你,请你恢复出明文。

输入格式:

第一行有一个正整数T(1 ≤ T ≤ 100),表示有T组数据。 每组数据的第一行有一个字符串s(1 ≤ s ≤ 1000),表示最终密文,保证字符串s全部由小写字母组成。 每组数据的第二行有一个数字x(0 ≤ x ≤ 25),表示恺撒加密的偏移量。

输出格式:

对于每组数据,输出加密前的明文。

输入样例:

2
ixfpmsmmpe 1
ijqcqxfgnhwwepm 2

输出样例:

helloworld
goodluckhavefun

代码实现

import java.util.Scanner;

public class Password07 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int line = scanner.nextInt();
        for (int i=0;i<line;i++){
            String next = scanner.next();
            int move = scanner.nextInt();
            char[] chars = next.toCharArray();
            char[] firstDecryption = new char[chars.length];
            char[] secondDecryption = new char[chars.length];
            int x=0,y;
            if (chars.length%2==0){
                y = chars.length/2;
            }else {
                y = chars.length/2+1;
            }
            for(int j=0;j<chars.length;j++){
                if (j%2==0){
                    firstDecryption[x]=chars[j];
                    secondDecryption[x] = (char) (firstDecryption[x]-move);
                    x++;
                }else{
                    firstDecryption[y]=chars[j];
                    secondDecryption[y] = (char) (firstDecryption[y]-move);
                    y++;
                }
            }
            System.out.println(secondDecryption);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值