36进制加法
36进制由0-9,a-z,共36个字符表示,最小为'0'; '0''9'对应十进制的09,'a''z'对应十进制的1035;例如:'1b' 换算成10进制等于 1 * 36^1 + 11 * 36^0 = 36 + 11 = 47; 要求按照加法规则计算出任意两个36进制正整数的和;如:按照加法规则,计算'1b' + '2x' = '48';要求:不允许把36进制数字整体转为10进制数字,计算出10进制数字的相加结果再转回为36进制
//测试 public class Main { public static void main(String[] args) { String result = addFunWithStr("1b", "2x"); System.out.println(result); } /** * 求36进制加法 * @param x 36进制被加数 * @param y 36进制加数 * @return 3进制的和 */ private static String addFunWithStr(String x, String y) { StringBuilder sbx = new StringBuilder(x); StringBuilder sby = new StringBuilder(y); String biaoGe = "0123456789abcdefghijklmnopqrstuvwxyz"; int lenX = x.length(); int lenY = y.length(); int missLen = lenX - lenY; //把两个加数的长度设为相同长度,短的前方补零。 if (missLen > 0) {//被加数长度长,加数前方补零 while (missLen > 0) { sby.insert(0, 0); missLen--; } } if (missLen < 0) {//加数长度长,被加数前方补零 while (missLen < 0) { sbx.insert(0, 0); missLen++; } } //和的容器 StringBuilder sbS = new StringBuilder(); int newlength = lenX > lenY ? lenX : lenY;//当前加数的长度,原两加数长度的较大者 int carry = 0; //进位数字 int curr = 0; //和的数字 for (int i = newlength - 1; i >= 0; i--) { //翻译算法; int shuz = biaoGe.indexOf(sbx.charAt(i)) + biaoGe.indexOf(sby.charAt(i)) + carry; carry = shuz / 36; curr = shuz % 36; //还原算法 sbS.insert(0, biaoGe.charAt(curr)); //sbC.insert(0,biaoGe.charAt(carry)); if (i == 0 && carry != 0) {//判断最高位是否有进位 sbS.insert(0, biaoGe.charAt(carry)); } } return sbS.toString(); }
}