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進制


思路
按照十進制的加法方法,滿36向前進一位

public class jinzhizhuanhuan {
    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' };
    //asList的返回對象是一個Arrays內部類,並沒有實現集合的修改方法,后台的數據仍是數組。
    static List<Character> list = Arrays.asList(nums);
 
    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);
    }
 
    static String f(String str1, String str2) {
        //toCharArray()方法可以將字符串對象中的字符轉換為一個字符數組
        char[] s1 = str1.toCharArray();
        char[] s2 = str2.toCharArray();
        //數組從0開始,因此減1
        int i = s1.length - 1;
        int j = s2.length - 1;
        int temp = 0;// 進位
        //也可以使用StringBuffer,但是它比 StringBuilder要慢。 在 StringBuilder 上的主要操作是 append 和 insert 方法。
        StringBuilder sb = new StringBuilder();
        //兩個相加的數的位數相同
        while (i >= 0 && j >= 0) {
            char c1 = s1[i];
            char c2 = s2[j];
            //返回指定字符在此字符串中第一次出現處的索引
            int index1 = list.indexOf(c1);
            int index2 = list.indexOf(c2);
            int sum = index1 + index2 + temp;
            if (sum >= 36) {
                temp = 1;
            //有進位時,用append()將余數進行拼接
                sb.append(list.get(sum % 36));
            } else {
            //沒有進位時,直接將相加得到的數進行拼接
                temp=0;
                sb.append(list.get(sum));
            }
            //--是因為要從低位開始相加
            i--;
            j--;
        }
        //第一個數位數多於第二個數的位數
        while (i >= 0) {
            int sum = list.indexOf(s1[i]) + temp;
            if (sum >=36) {
                temp = 1;
                sb.append(list.get(sum % 36));
            } else {
                temp=0;
                sb.append(list.get(sum));
            }
            i--;
        }
        //第一個數位數小於第二個數的位數
        while (j >= 0) {
            int sum = list.indexOf(s2[j]) + temp;
            if (sum >=36) {
                temp = 1;
                sb.append(list.get(sum % 36));
            } else {
                temp=0;
                sb.append(list.get(sum));
            }
            j--;
        }
        //temp!=0說明有進位,這是需要把進位的1拼接
        if(temp!=0){
            sb.append('1');
        }
        //前面拼接是從個位開始的,也就是拼接出來的數跟所求的數是倒着的
        //reverse() 方法用於顛倒數組中元素的順序
        return sb.reverse().toString();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM