Java實現任意進制轉換

本文實例為大傢分享瞭Java實現任意進制轉換的具體代碼,供大傢參考,具體內容如下

問題描述

編寫程序實現任意進制間的相互轉換

(一)、進制轉換思想

1、先把任意進制轉化為十進制
2、再把十進制轉化為任意進制
3、本算法結合瞭十以下進制利用公式轉換以及十以上進制調用函數轉換

(二)、問題分析

1.輸入當前數進制

輸入當前進制 m ,且保證 m>1

public static void main (String[] args){
        int l,m,n;
        String l16;
        Scanner sc = new Scanner(System.in);
        System.out.println("請問當前數為幾進制(m>1)");
        m = sc.nextInt();

2.輸入當前數

(1)m進制數要保證每個數字小於 m

System.out.println("請輸入當前數,每個數字均要小於"+m);
        int temp=0,i=0;

(2)對於十以下進制,輸入的是數值型,采用 l=sc.nextInt();
(3)利用公式計算轉化為十進制,可調用 Math 的 pow(m,i) 函數,用以計算 m 的 i 次冪;數值的每個數字從右到左依次與 m^i (i=0,1,2……)相乘,可利用除10求餘(%)運算;每計算一次,原數據縮小十倍且隻保留整數部分(除運算 :/ ),直到數值為0結束

if(m<=10){
      l=sc.nextInt();
      while(l!=0){
         temp+=(l%10)*Math.pow(m,i);
         i+=1;
         l=l/10;
}
} 

(4)對於大於十的進制,輸入的是字符串型,采用 l16=sc.next();
(5)可以直接調用 把任意進制轉化為十進制 的包Integer.valueOf()

 else{
     l16=sc.next();
      temp=Integer.valueOf(l16,m);
}

(6)所以實際上這裡面其實隻用 temp=Integer.valueOf(l16,m); 就可以解決整個問題,因為十以下進制的數也能看成字符串型,這裡為瞭介紹兩種方法

4.輸入待轉化進制

這裡仍然介紹兩種方法,十以下進制、十以上進制分開處理

System.out.println("請問要轉換為幾進制(n>1)");
n = sc.nextInt();

(1)十以下進制采用公式,並把該處理方法封裝在一個類(ConversionN)裡
(2)temp 為上一段轉化後的十進制數,n 為待轉進制
(3)十進制 temp 轉化為 n 進制的思想是:當前數除 n 取餘(% 運算),得到的數字放在右邊第一位(相當於該數字乘1);把該數縮小十倍保留整數部分,繼續除 n 取餘,得到的數字放在右邊第二位(相當於該數字乘10);依次循環,把最終得到的數加在一起,就是轉化的 n 進制數

public static int ConversionN(int temp,int n){
        int l=0,j=1;
        while(n<=10 && temp!=0){
            l+=(temp%n)*j;
            temp=temp/n;
            j=j*10;
        }

        return l;
    }

(4)十以上進制直接調用 把十進制轉換成任意進制 的包 Integer.toString()

String L16=Integer.toString(temp,n);
System.out.println("該數由"+m+"進制轉化為"+n+"進制的結果為:"+L16);

5.輸出轉化後數值

(1)由於選擇轉化的進制不同(十以下,十以上),所以輸出的路徑也不同
(2)采用三目運算符根據范圍選擇路徑:十進制以下路徑1,十進制以上路徑2,n <=1 路徑3(提示輸入有誤)
(3)結合 Switch 語句,完成選擇語句

int a = n<=10 & n>1 ? 1: n>10 ? 2:3;

        switch (a){
            case 1 :
                BaseConversion base = new BaseConversion();
                System.out.println("該數由"+m+"進制轉化為"+n+"進制的結果為:"+base.ConversionN(temp,n));
                break;

            case 2 :
                String L16=Integer.toString(temp,n);
                System.out.println("該數由"+m+"進制轉化為"+n+"進制的結果為:"+L16);
                break;

            case 3:
                System.out.println("輸入有誤");
                break;

        }

    }

(三)、完整代碼

把上述代碼整理

import java.util.*;
public class BaseConversion {
    public static void main (String[] args){
        int l,m,n;
        String l16;
        Scanner sc = new Scanner(System.in);
        System.out.println("請問當前數為幾進制(m>1)");
        m = sc.nextInt();
        System.out.println("請問要轉換為幾進制(n>1)");
        n = sc.nextInt();

        System.out.println("請輸入當前數,每個數字均要小於"+m);
        int temp=0,i=0;
        if(m<=10){
            l=sc.nextInt();
            while(l!=0){
                temp+=(l%10)*Math.pow(m,i);
                i+=1;
                l=l/10;
            }
        }
        else{
            l16=sc.next();
            temp=Integer.valueOf(l16,m);
        }

        int a = n<=10 & n>1 ? 1: n>10 ? 2:3;

        switch (a){
            case 1 :
                BaseConversion base = new BaseConversion();
                System.out.println("該數由"+m+"進制轉化為"+n+"進制的結果為:"+base.ConversionN(temp,n));
                break;

            case 2 :
                String L16=Integer.toString(temp,n);
                System.out.println("該數由"+m+"進制轉化為"+n+"進制的結果為:"+L16);
                break;

            case 3:
                System.out.println("輸入有誤");
                break;

        }

    }

    public static int ConversionN(int temp,int n){
        int l=0,j=1;
        while(n<=10 && temp!=0){
            l+=(temp%n)*j;
            temp=temp/n;
            j=j*10;
        }

        return l;
    }

}

(四)運行結果

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: