java 手动实现算法 任意进制之间转换

题目: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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值