PAT(B) 1048 数字加密(Java)字符串
题目描述
本题要求实现一种数字加密方法。首先固定一个加密用正整数 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; // 奇偶位转换
}
}
}