2017-02-20 94 views
1

我有一個家庭作業,我必須將底座轉換爲底數10.我有一些給定的數字,它們是「basen」。我必須轉換這些基地立足10,我卡在只有部分是這部分代碼:在Java中轉換爲基數10?

answer = ; // Not sure what I have to put in here 

我已經看到了一些其他職位有關轉換到底數十,但我只是不知道如何將它們合併到我的代碼中。

public class BaseN { 

public static final int BASEN_ERRNO = -1; 
public static int digit = 0; 

public static void main(String[] argv) { 
    basen(512, 6); 
    basen(314, 8); 
    basen(49, 5); 
    basen(10101, 2); 
} 

public static void basen(int n, int b) { 
    int ans = basen(n, b, 1, 0); 
    if (ans == BASEN_ERRNO) 
    System.out.println(n + " is not a valid base-" + b + " number"); 
    else 
    System.out.println(n + " base-" + b + " = " + ans + " base-10"); 
} 

public static int basen(int number, int base, int placevalue, int answer) { 
    if (number == 0) return answer; 
    digit = number % 10; 
    if (digit >= base) return BASEN_ERRNO; 
    answer = 1;// not sure what to put here 
    number = 0; 
    placevalue = 0; 
    return basen(number, base, placevalue, answer); 
} 
} 
+2

當處理數字的基-n表示時,您隱含地談論了一串字符。你的代碼完全處理'int'值,它代表二進制數字(基數2),並且沒有能力在其他基數中表示數字。你將不得不重新思考你的問題的定義,所以輸入是一個基本字符串,輸出是一個基於10的字符串。 –

+1

Java對你有一個有用的例程:'Integer.parseInt(numberString,base) '如果提供的String不代表給定基數的有效數字,將拋出'NumberFormatException'。如果那不是你的老師會好起來的,你能告訴我們他/她想要你做什麼嗎? –

+0

@Ted Hopp給了你一個大祕密,一個數字就是這樣,而這些基礎是關於字符串的。你是否熟悉數字基礎?對於基數'b',它是係數序列'd,0 <= d

回答

0

您可以實現以下算法。比方說,你給予String number它代表你想要轉換成十進制形式的數字和int base,它代表了給定數字的基數。您可以實現功能int convertToNumber(char c);它接受代表從你的電話號碼一個數字一個字符,字符會這樣映射到數字:

0 - > 0, 1 - > 1, ..., A-> 10, 乙 - > 11, ..., 的F - > 15, ...

然後你只需通過您指定的字符串迭代,該功能與輸出基地繁衍迭代的力量。例如,轉換數字A32(十六進制): A32 = convertToNumber(A)* b^2 + convertToNumber(3)* b^1 + convertToNumber(2)* b^0 = 10 * 16^2 + 3 * 16^1 + 2 * 16^0 = 10 * 16 * 16 + 3 * 16 + 2 = 2610(十進制)。

public class BaseConvert { 

    public static int convertDigitToNumber(char c) throws Exception { 
     if(c >= '0' && c <= '9') return c - '0'; 
     if(c >= 'A' && c <= 'Z') return c - 55; 
     if(c >= 'a' && c <= 'z') return c - 97; 
     throw new Exception("Invalid digit!"); 
    } 

    public static int convertToBase(String number, int base) throws Exception { 
     int result = 0; 
     for(int i = 0; i < number.length(); i++){ 
      result += convertDigitToNumber(number.charAt(i)) * (int)Math.pow(base, number.length() - i - 1); 
     } 
     return result; 
    } 

    public static void main(String[] args) { 

     try{ 
      System.out.println(convertToBase("732", 8)); 
      System.out.println(convertToBase("A32", 16)); 
      System.out.println(convertToBase("1010", 2)); 
     }catch (Exception e) { 
      System.out.print(e); 
     } 
    } 
} 
0

你可以看n爲底的AK長數是這樣的:
X(0)* N ^(K-1)+ X(1)* N ^(K-2)+ ..其中x(0),x(1),...,x(k)是從位置k開始的數字,其中x(k-1)* n^1 + x(k)* n^0
剩下。

因此,如果您試圖將101 base 2轉換爲base 10,則需要執行以下操作:
1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 4 + 0 + 1 = 5個鹼基10

說你想從鹼基6轉換352:
3 * 6^2 + 5 * 6^1 + 2 * 6^0 = 108 + 30 + 2 = 145鹼基10

你在找什麼代碼明智的是這樣的:

int[] digits = {3, 5, 2}; 
int base = 6; 
int answer = 0; 
for(int i = digits.length - 1; i >= 0; i--) 
{ 
    answer += digits[i] * Math.pow(base,digits.length-i-1); 
} 
return answer; 

將返回145.

希望即使我的實現是迭代的,你也應該能夠將它應用到遞歸實現中。