首页 > 试题广场 >

36进制加法

[编程题]36进制加法
  • 热度指数:1456 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
36进制数由 0~9 , a~z 共 36 个字符组成,请你按照加法规则计算两个 36 进制数的和。
例如 1b+2b = 3m

数据范围:两个数的长度都满足 , 两个数中包含的字符仅包括
示例1

输入

"1b","2b"

输出

"3m"
示例2

输入

"z","1"

输出

"10"
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @param B string字符串 
     * @return string字符串
     */
    public String thirtysixAdd (String A, String B) {
        // write code here
        int add = 0;
        StringBuilder sb = new StringBuilder();
        char[] arr1 = A.toCharArray();
        char[] arr2 = B.toCharArray();
        int a = arr1.length - 1;
        int b = arr2.length - 1;
        while (a >= 0 || b >= 0 || add != 0) {
            int x = a >= 0 ? (Character.isDigit(A.charAt(a)) ? A.charAt(a) - '0' : (A.charAt(a) - 'a' + 10))
                : 0;
            int y = b >= 0 ? (Character.isDigit(B.charAt(b)) ? B.charAt(b) - '0' : (B.charAt(b) - 'a' + 10))
                : 0;  
            int res = (x + y + add) % 36;
            if (res >= 0 && res <= 9) {
                sb.append(res);
            } else {
                sb.append((char)(res - 10 + 'a'));
            }
            add = (x + y + add) / 36;
            a--;
            b--;      
        }
        return sb.reverse().toString();
    }
}

发表于 2024-02-14 11:30:07 回复(0)
import java.util.*;


public class Solution {
    public static HashMap<Integer, Character> map1 = new HashMap<>();
    public static HashMap<Character, Integer> map2 = new HashMap<>();
    
    static{
         generate36Str();
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @param B string字符串 
     * @return string字符串
     */
     public  String thirtysixAdd (String A, String B) {
        // write code here
        int n = A.length()-1, m = B.length()-1;
        StringBuilder ans = new StringBuilder();
        int add = 0;
        while(n >= 0 || m >= 0 || add != 0) {
            int a = n >= 0 ? map2.get(A.charAt(n)) : 0;
            int b = m >= 0 ? map2.get(B.charAt(m)) : 0;
            int sum = a + b + add;
            ans.append(map1.get(sum % 36));
            add = sum / 36;
            n--;
            m--;
        }
        ans.reverse();
        return ans.toString();
    }

    public static void generate36Str() {
        for(int i = 0; i <= 9 ; i++) {
            map1.put(i, (char) (48 + i));
            map2.put((char) (48 + i), i);
        }

        for(int i = 0; i <= 26 ; i++) {
            map1.put(10 + i, (char) (97 + i));
            map2.put((char) (97 + i), 10 + i);
        }
    }
}

发表于 2022-06-15 15:29:35 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @param B string字符串 
     * @return string字符串
     */
    public String thirtysixAdd (String a, String b) {
        // write code here
        StringBuilder sb = new StringBuilder();
        int i = a.length() - 1, j = b.length() - 1;
        int r = 0;
        while (i >= 0 && j >= 0) {
            int x = char2int(a.charAt(i--)) + char2int(b.charAt(j--)) + r;
            sb.append(int2char(x % 36));
            r = x / 36;
        }
        while (i >= 0) {
            int x = char2int(a.charAt(i--)) + r;
            sb.append(int2char(x));
            r = x / 36;
        }
        while (j >= 0) {
            int x = char2int(b.charAt(j--)) + r;
            sb.append(int2char(x));
            r = x / 36;
        }
        if (r != 0)
            sb.append(int2char(r));
        return sb.reverse().toString();
    }


    private int char2int(char c) {
        if ('0' <= c && c <= '9')
            return c - '0';
        return c - 'a' + 10;
    }

    private char int2char(int x) {
        if (0 <= x && x <= 9)
            return (char) ('0' + x);
        return (char) ((x - 10) + 'a');
    }
}

发表于 2022-04-24 22:47:25 回复(0)

问题信息

难度:
5条回答 2796浏览

热门推荐

通过挑战的用户

查看代码