小M的37进制数字相乘问题

163 阅读1分钟

使用BigDecimal可以很方便:

  1. 将37进制字符串转换为十进制

    • 对于字符串 a 和 b,分别进行遍历,将每个字符转换为对应的十进制数值。
    • 如果字符是数字(‘0’-‘9’),直接减去’0’的ASCII码值;如果是字母(‘A’-‘Z’),则减去’@'的ASCII码值(或者55),再加上10得到正确的数值。
    • 将每个字符对应的数值乘以37的幂次累加到 ta 或 tb
  2. 计算乘积

    • 将 ta 和 tb 相乘,得到十进制下的乘积结果 res
  3. 将十进制乘积转换为37进制

    • 使用一个栈 ch 来存储37进制表示的每一位字符。
    • 通过循环,将 res 除以37,并取余数,将余数转换为对应的37进制字符,并推入栈中。
    • 注意,在除法操作中,需要使用 BigDecimal.ROUND_DOWN 以确保没有小数部分。
  4. 构建并返回37进制字符串

    • 从栈中弹出所有字符,并构建成字符串 ans
    • 输出并返回 ans
import java.math.BigDecimal;
import java.util.Stack;
public class Main {
    public static String solution(String a, String b) {

        BigDecimal ta=BigDecimal.ZERO,tb=BigDecimal.ZERO;
        BigDecimal val=BigDecimal.valueOf(37);
        int la=a.length(),lb=b.length(),i,num;
        //先将其转化为十进制
        for(i=0;i<la;i++){
            num=a.charAt(i);
            if(num!=36)
            {
                if(num<58){
                    num-=48;
                }else{
                    num-=55;
                }
            }
            ta=ta.multiply(val);
            ta=ta.add(BigDecimal.valueOf(num));
        }
        for(i=0;i<lb;i++){
            num=b.charAt(i);
            if(num<58){
                num-=48;
            }else{
                num-=55;
            }
            tb=tb.multiply(val);
            tb=tb.add(BigDecimal.valueOf(num));
        }
        BigDecimal res=ta.multiply(tb);
        //System.out.println("两数相乘是:"+res);
        Stack<Character> ch=new Stack<>();
        int tmp;
        while(res.compareTo(BigDecimal.ZERO) > 0){
            tmp=res.remainder(val).intValue();
            //res=res.divide(val);没指定小数部分,所以会出错!
            res = res.divide(val, BigDecimal.ROUND_DOWN);
            if(tmp!=36){
                if(tmp<10){
                    tmp+=48;
                }else{
                    tmp+=55;
                }
            }
            ch.push((char)tmp);
        }
        StringBuilder sb=new StringBuilder();
        while(!ch.isEmpty()){
            sb.append(ch.pop());
        }
        String ans=sb.toString();
        System.out.println("ans:"+ans);
        return ans;
    }

    public static void main(String[] args) {
        System.out.println(solution("ZZ", "X").equals("V8"));
        System.out.println(solution("A", "B").equals("2$"));
    }
}