三十六进制加法:
由数字 + 小写字母
组成
0-9 表示 0-9
a-z 表示 10-35
第一种、直接通过36进制将两个数相加
思路: 通过一个数组下标相加是否超出36 判断是否进位
public class Main {
public static Character[] nums = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
// 底层还是数组
private static List<Character> list = Arrays.asList(nums);
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str1 = in.nextLine();
String str2 = in.nextLine();
System.out.println(addResult(str1,str2));
}
// 相加
public static String addResult(String str1, String str2) {
char[] s1 = str1.toCharArray();
char[] s2 = str2.toCharArray();
// 低位到高位
int i = str1.length() - 1;
int j = str2.length() - 1;
// 判断进位
int temp = 0;
// StringBuilder 我记得好像是比 StringBuffer 还要高级的封装,比StringBuffer 快一下,主要用于 append 和 insert
StringBuilder sb = new StringBuilder();
// str1 和 str2 位数相等
while(i >= 0 && j >= 0) {
// 找出该字符的索引
int index1 = list.indexOf(s1[i]);
int index2 = list.indexOf(s2[j]);
int sum = index1 + index2 + temp;
// 判断进位
if(sum >= 36) {
temp = 1;
sb.append(list.get(sum % 36));
}else {
temp = 0;
sb.append(list.get(sum));
}
i--;
j--;
}
// str1 比 str2 多位数
while(i >= 0) {
int index1 = list.indexOf(s1[i]);
int sum = index1 + temp;
// 判断进位
if(sum >= 36) {
temp = 1;
sb.append(list.get(sum % 36));
}else {
temp = 0;
sb.append(list.get(sum));
}
i--;
}
// str2 比 str1 多位数
while(j >= 0) {
int index2 = list.indexOf(s2[j]);
int sum = index2 + temp;
if(sum >= 36) {
temp = 1;
sb.append(list.get(sum % 36));
}else {
temp = 0;
sb.append(list.get(sum));
}
j--;
}
// 最后判断是否存在进位
if(temp >= 1) {
sb.append(1);
}
// 从低位加到高位的,所以反转
return sb.reverse().toString();
}
}
第二种、暴力转换
思路: 先把 36 进制转换成10进制,10 进制相加,再把结果转换成 36 进制
public class Main {
public static Character[] nums = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
// 底层还是数组
private static List<Character> list = Arrays.asList(nums);
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str1 = in.nextLine();
String str2 = in.nextLine();
System.out.println(addResult(str1,str2));
}
// 相加
public static String addResult(String str1, String str2) {
char[] s1 = str1.toCharArray();
char[] s2 = str2.toCharArray();
int i = str1.length() - 1;
int j = str2.length() - 1;
int sum = 0;
// 转 10 进制
while(i >= 0) {
int index = list.indexOf(s1[i]);
sum += index * Math.pow(36, str1.length()-i-1);
i--;
}
while(j >= 0) {
int index = list.indexOf(s2[j]);
sum += index * Math.pow(36, str2.length()-j-1);
j--;
}
// 将 结果 转成36进制
StringBuilder sb = new StringBuilder();
while(sum != 0) {
int num = sum % 36;
sb.append(list.get(num));
sum /= 36;
}
return sb.reverse().toString();
}
}