题目描述:
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:
1234567 368782971
输出样例:
3695Q8118
百度了一下,才知道坑,参考参考思路
代码示例(Java实现)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
char[] cs = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K'};
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
String num = cin.readLine();
String num1 = num.split(" ")[0];
String num2 = num.split(" ")[1];
StringBuilder result = new StringBuilder();
// 这题比较坑的就是,本以为 B 的长度小于 A 的长度,只需要处理 B 的长度的数字就可以了
// 后来查阅别人的,才发现需要将 B 前面补 0 到跟 A 的长度一样
StringBuilder num2Builder = new StringBuilder(num2);
for (int i = 0; i < num1.length() - num2.length(); i++) {
num2Builder.insert(0, "0");
}
num2 = num2Builder.toString();
for (int i = 0; i < Math.min(num1.length(), num2.length()); i++) {
// 取出 num1 的后一位
int n1 = num1.charAt(num1.length() - i - 1) - '0';
int n2 = num2.charAt(num2.length() - i - 1) - '0';
// 奇数位
if (i % 2 == 0) {
result.insert(0, cs[(n1 + n2) % 13]);
} else {
int sum = n2 - n1;
if (sum < 0) {
sum += 10;
}
result.insert(0, sum);
}
}
// 如果 B 的长度大于 A 的长度,要把 B 比 A 长的那几个数字给取出来
if (num1.length() < num2.length()) {
int temp = num2.length() - num1.length();
result.insert(0, num2.substring(0, temp));
}
// // 统计一下开头的 0 的个数(本以为计算结果的前面的 0 要给去掉,后面测试发现不需要)
// int index = 0;
// if (result.charAt(0) == '0') {
// while (index < result.length() && result.charAt(index) == '0') {
// index++;
// }
// }
System.out.println(result.toString());
}
}