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();
}

}

全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
04-29 12:10
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务