使用BigDecimal可以很方便:
-
将37进制字符串转换为十进制:
- 对于字符串
a和b,分别进行遍历,将每个字符转换为对应的十进制数值。 - 如果字符是数字(‘0’-‘9’),直接减去’0’的ASCII码值;如果是字母(‘A’-‘Z’),则减去’@'的ASCII码值(或者55),再加上10得到正确的数值。
- 将每个字符对应的数值乘以37的幂次累加到
ta或tb。
- 对于字符串
-
计算乘积:
- 将
ta和tb相乘,得到十进制下的乘积结果res。
- 将
-
将十进制乘积转换为37进制:
- 使用一个栈
ch来存储37进制表示的每一位字符。 - 通过循环,将
res除以37,并取余数,将余数转换为对应的37进制字符,并推入栈中。 - 注意,在除法操作中,需要使用
BigDecimal.ROUND_DOWN以确保没有小数部分。
- 使用一个栈
-
构建并返回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$"));
}
}