题目:src字符串,给出src代表的src_base进制 要求转换成 dst_base进制
函数签名:
String convertNum(String src,int src_base,int dst_base)
如 -12 8进制转换成2进制 convertNum("-12",8,2) 为 -1010
36 7进制转17进制 convertNum("36",9,17); 等于1G
解题思路:先将src_base进制转换成10进制,类似2进制转10进制使用相乘求和,再将该10进制数转换成dst_base进制,使用除x取余法,x就是对应的进制。 方法和 2进制、10进制互转思路一致,只是将其中进制换成了src_base和dst_base而已。
package leetcode.test;
public class atoi01 {
//用于将字符转换成数字表示
public int str2num(char c){
if('0'<=c&&c<='9'){
return c-'0';
}else{
return c-'A'+10;
}
}
//将数字转换成字符表示
public char num2str(int num){
if(0<=num&&num<=9){
return (char)(num+'0');
}else{
return (char)('A'+num-10);
}
}
public int convert10(String src,int src_base){
int ans=0;
//转10进制
int k=1;
for(int i=src.length()-1;i>=0;i--){
if(i==0&&src.charAt(i)=='-'){
//处理负号
ans*=-1;
break;
}
ans+=str2num(src.charAt(i))*k;
k*=src_base;
}
return ans;
}
public String convertNum(String src,int src_base,int dst_base){
//1. src 先转换成10进制
int res=convert10(src,src_base);
//优化:小于dst进制直接返回结果即可
if(res<dst_base) return String.valueOf(res);
//2. 10进制res转dst_base
StringBuilder ans=new StringBuilder();
//处理负号
int flag=1;
if(res<0) flag=-1;
res=Math.abs(res);
while(res!=0){
ans.append(num2str(res%dst_base));
res/=dst_base;
}
if(flag==-1) ans.append("-");
return ans.reverse().toString();
}
public static void main(String[] args) {
String res=new atoi01().convertNum("0",2,8);
System.out.println(res);
}
}