问题描述
36进制由0-9,a-z,共36个字符表示
例如:
'1b' 换算成10进制等于 1 * 36^1 + 11 * 36^0 = 36 + 11 = 47 要求按照加法规则计算出任意两个36进制正整数的和 如:按照加法规则,计算'1b' + '2x' = '48'
要求:
- 不允许把36进制数字整体转为10进制数字,计算出10进制数字的相加结果再转回为36进制
思路
- 按照十进制的加法方法,满36向前进一位
public class Main {
final static String value = "0123456789ABCDEFGHIJKLMNOPGQRSTUVWXYZ";
static String f(String str1, String str2) {
char[] s1 = str1.toCharArray();
char[] s2 = str2.toCharArray();
int i = s1.length - 1;
int j = s2.length - 1;
int tmp = 0;
StringBuilder sb = new StringBuilder();
while (i >= 0 && j >=0) {
char c1 = s1[i];
char c2 = s2[j];
int sum = value.indexOf(c1) + value.indexOf(c2) + tmp;
if (sum >= 36) {
tmp = 1;
sb.append(value.charAt(sum & 36));
} else {
sb.append(value.charAt(sum));
}
i--;
j--;
}
//第一个数位数多于第二个数的位数
while (i >= 0) {
int sum = value.indexOf(s1[i]) + tmp;
if (sum >= 36) {
tmp = 1;
sb.append(value.charAt(sum & 36));
} else {
sb.append(value.charAt(sum));
}
i--;
}
//第二个数位数多于第一个数的位数
while (j >= 0) {
int sum = value.indexOf(s2[j]) + tmp;
if (sum >= 36) {
tmp = 1;
sb.append(value.charAt(sum & 36));
} else {
sb.append(value.charAt(sum));
}
j--;
}
//temp!=0说明有进位,这是需要把进位的1拼接
if (tmp != 0) {
sb.append('1');
}
return sb.reverse().toString();
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str1 = scan.next();
String str2 = scan.next();
String r = f(str1,str2);
System.out.println(r);
}
}
京公网安备 11010502036488号