PAT(B) 1048 数字加密(Java)字符串

题目链接:1048 数字加密 (20 point(s))

题目描述

本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。

输入格式

输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。

输出格式

在一行中输出加密后的结果。

测试样例

Case 0:

1234567 368782971
3695Q8118

Case 1:

368782971 1234567
95Q2198

Case 2:

1234567890 1234567890
04080K0300

分析💬

位数较少的数字前面补0。

Java代码

/**********************************************************************************
Submit Time			Status		Score	Problem	Compiler		Run Time	User
8/7/2019, 21:26:24	Accepted	20		1048	Java (openjdk)	89 ms		wowpH
**********************************************************************************/
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	private static StringBuilder zero(int len) {		// 生成'0'串
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < len; ++i) {
			sb.append('0');
		}
		return sb;
	}

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] str = br.readLine().split(" ");
		String table = "0123456789JQK";
		char[] a = str[0].toCharArray();
		char[] b = str[1].toCharArray();
		int len = Math.abs(str[1].length() - str[0].length());// 长度差
		if (a.length < b.length) {						// a短
			a = zero(len).append(str[0]).toString().toCharArray();// 0串加a串
		} else if (a.length > b.length) {				// b短
			b = zero(len).append(str[1]).toString().toCharArray();// 0串加b串
		}
		int PF = -1;									// 奇偶标志,默认偶数
		if (1 == (b.length & 1)) {
			PF = 1;										// 奇数
		}
		for (int i = 0; i < b.length; ++i) {
			int x = ((b[i] - 48) + PF * (a[i] - 48)) % 13;// 位运算
			if (x < 0) {
				x += 10;								// 负数加10
			}
			System.out.print(table.charAt(x));			// 对应字符
			PF = -PF;									// 奇偶位转换
		}
	}
}

提交结果

提交结果

posted @ 2019-08-07 21:34  wowpH  阅读(288)  评论(0编辑  收藏  举报