N进制转M问题(理论上没有限制)

很经典的问题,自己动手写了一遍代码。
不同的是,我没有采取字母代替高进制数的做法(如16进制用字母abcdefg表示数字),而是采取 用多位数表示数字,如16进制里20表示为:01 04,16则表示为01 00,17表示为0101。以此类推,而对于101-1000进制的数,则用三位数表示,如001 057。
这样做就可以表示进制很大的数了。理论上,这种做法只受限于整形最大值,当然如果换成数组或者字符串表示,还可以突破这个限制。

public class Main {

    public static void main(String[] args) {
        System.out.println(jinZhiZhuanHuan(352, 10,16));

    }

    static int jinZhiZhuanHuan(int value,int n,int m){
        //value是某进制的数,n为value的进制,m是目标进制
        //若进制较高,则用多位表示,例如16进制用两位数表示以为0-15
        int n_sign=calculate_radix(n-1);//记录多少位数表示一个数
        int n_index=power(10, n_sign);//获取进位的数
        int Remainder=0;//记录余数
        int Decimal=0;//转化为10进制的值

        //转化为10进制数
        for(int i=0;;i++){
            Remainder=value%n_index;
            Decimal+=power(n,i)*Remainder;
            value/=n_index;
            if(value==0)
                break;  
        }

        //十进制数转换成m进制数
        int m_value=0;
        int m_sign=calculate_radix(m-1);
        int m_index=power(10, m_sign);//获取进位的数
        for(int i=0;;i++){
            m_value+=((Decimal%m)*power(m_index, i));
            Decimal/=m;
            if(Decimal==0)
                break;

        }
        return m_value;

    }

    //求一个的的N次方,math里只有double类型的,所以我就自己写了一个
    static int power(int a,int n){
        if(n==0)
            return 1;
        while(n>1){
            a*=a;
            n--;
        }
        return a;
    }

    //求一个整数的基数,例如 5251是4位数,基数就为4。
    static int calculate_radix(int n){
        int radix=0;
        while(n!=0){
            radix++;
            n /= 10;
        }
        return radix;
    }
}

结果示例:
输入:jinZhiZhuanHuan(11114, 16,12)//11114是个16进制数
输出:30102 //12进制数

输入输出都会遵循上面解释的位数表示方法,只是,对于最左边的一位数,理论上需要补0的,实际上却不能补,因为int a=011会转换为8进制数,所以最前面是不能补0的,一样,输出的话,整数不会再前面输出0,当然这些其实都可以解决,比如用字符串,用数组。。

这个算法可以算高进制的数,算是一个特点吧,其实也不能。也许还有改进的地方,我没有仔细想了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lsjweiyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值