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,當然這些其實都可以解決,比如用字符串,用數組。。

這個算法可以算高進制的數,算是一個特點吧,其實也不能。也許還有改進的地方,我沒有仔細想了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章