PAT乙级 1048 数字加密 (20 分) Java 实现

本文提供PAT1048题目的两种解决方案,重点介绍了如何处理字符串加密问题,包括位数差计算、数字相加及减法运算,并通过13取余实现加密。文章对比了两种解题思路,帮助读者理解最优解。

笔者首先是这么写的,但是只有3分

import java.util.Scanner;

public class pat1048 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		String A = input.next();
		String B = input.next();
		String output = "";
		int diff = B.length() - A.length();		//计算两个数字的位数差;
		if(diff<0) diff = 0;					//如果A的长度大于B的长度,diff归零
		for(int i=0;i<diff;i++) output += (B.charAt(i)-'0'); 			//先输出不加密部分
		
		String[] arr = {"0","1","2","3","4","5","6","7","8","9","J","Q","K"};
		for(int i=diff;i<B.length();i++) {
			if(i%2==0) {				//如果是奇数,因为第一位diff是0,所以奇偶是反的
				int num = (B.charAt(i) - '0') + (A.charAt(i-diff) - '0');	//两数相加
				num = num%13;			//13取余
				output += arr[num];
			}else {
				int num = (B.charAt(i) - '0') - (A.charAt(i-diff) - '0');	//B-A
				if(num<0) num += 10;	//负数加10
				output += arr[num];
			}
		}
		System.out.println(output);
	}

}

 这是通过学习PauperGuy代码,改过以后的代码,我愿称这道题目的判定为NT,什么都没多学到,浪费了半小时。

import java.util.Scanner;

public class pat1048 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		String A = input.next();
		String B = input.next();
		String output = "";
		String[] arr = {"0","1","2","3","4","5","6","7","8","9","J","Q","K"};
		int len;
		int diff = A.length() - B.length();		//计算两个数字的位数差;
		if(diff<0) for(int i=0;i<Math.abs(diff);i++) A = "0" + A;		//如果B比A长,就用 “0” 来补全A
		else for(int i=0;i<diff;i++) B = "0" + B;						//A比B长,补全B
		
		char[] arrA = A.toCharArray(), arrB = B.toCharArray();
		len = arrA.length;
		for(int i=len-1;i>=0;i--) {
			if((len-i)%2==1) {				//如果是奇数,因为第一位diff是0,所以奇偶是反的
				int num = (arrB[i] - '0') + (arrA[i] - '0');	//两数相加
				num = num%13;			//13取余
				output = arr[num] + output;
			}else {
				int num = (arrB[i] - '0') - (arrA[i] - '0');	//B-A
				if(num<0) num += 10;	//负数加10
				output = arr[num] + output;
			}
		}
		System.out.println(output);
	}

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值