2013-11-22 43 views
0

我需要製作一個將十進制轉換爲十六進制的遞歸方法。 我不能使用Integer.toHexString。 編輯:我想這個代碼,但它不能正常工作使用遞歸方法將十進制轉換爲十六進制Java

public static String Hexa(String s) { 
    String result = ""; 
    int n = Integer.parseInt(s); 
    int remainder = n % 16; 

    if (n == 0) { 
     return Integer.toString(0); 
    } else { 
     switch (remainder) { 
      case 10: 
       result = "A" + result; 
       break; 
      case 11: 
       result = "B" + result; 
       break; 
      case 12: 
       result = "C" + result; 
       break; 
      case 13: 
       result = "D" + result; 
       break; 
      case 14: 
       result = "E" + result; 
       break; 
      case 15: 
       result = "F" + result; 
       break; 
      default: result = Integer.toString(n/16) + result; break; 
     } 
     System.out.println(result); 
     return Hexa(Integer.toString(n/16)) + result; 
    } 
} 

編輯: 改變了default情況和if (n == 0)循環return語句,現在精美的作品。

新代碼:

public static String Hexa(String s) { 
     String result = ""; 
     int n = Integer.parseInt(s); 
     int remainder = n % 16; 

     if (n == 0) { 
      return ""; 
     } else { 
      switch (remainder) { 
       case 10: 
        result = "A"; 
        break; 
       case 11: 
        result = "B"; 
        break; 
       case 12: 
        result = "C"; 
        break; 
       case 13: 
        result = "D"; 
        break; 
       case 14: 
        result = "E"; 
        break; 
       case 15: 
        result = "F"; 
        break; 
       default: 
        result = remainder + result; 
        break; 
      } 
      return Hexa(Integer.toString(n/16)) + result; 
     } 
    } 
+1

所以你有什麼嘗試? – Reimeus

+1

'整數。toHexString'不會將十進制轉換爲十六進制:)無論如何, –

+0

您連接了兩次,這就是爲什麼它不能正常工作。你正在迭代與遞歸混合。 –

回答

3

的問題是在你的違約條款:

default: result = Integer.toString(n/16) + result; break; 

應改爲:

default: result = Integer.toString(remainder) + result; break; 

這將使你的程序返回 「04D2」。

但還有其他幾種改正你可以:

  1. 停止來回轉換爲字符串。例如同一行可以只是:

    default: result = remainder + result; break;

    此外,更改參數的時間int。如果您確實需要收到String,請將其設爲輔助功能,並使主功能得到String

  2. 你並不需要一個break在您default

  3. 結束你不需要的開關。是不是'F' = 'A' + (15 - 10)?你可以想出如何建立一個公式,將[10,15]中的任何數字轉換爲相應的字母。

  4. 相反的Integer.toString(0)可以使用"0" ...但是,這甚至不是必要的,你可以使用"",以避免在輸出領先0。如果您擔心處理整個號碼爲"0"的特殊情況,請添加特殊條款。

+1

我做了你剛剛提到它之前所說的內容,請參閱我的編輯。謝謝 –

+0

在默認子句中,您正在執行:'result = remainder + result'。那只是將int更改爲String?你可以做得更清楚:'result =「」+ remaining'。或者在這種情況下使用您的Integer.toString版本 – MondKin

+0

如果它返回一個字符串並且參數是一個int,我將如何遞歸? –

0

下面的代碼可以幫助你解決你的問題:

public static String decimalToAnyBase(int num,int base) {  
    if(num<base) { 
     return num+""; 
    } 
    String result=null; 
    int rem=num%base; 
    String str=decimalToAnyBase(num/base, base); 
    result=str+((rem>=10)? (char)(rem-10+'A')+"":rem); 
    return result; 
} 
0

那麼,對於你的問題的第二部分,我相信你從Mr.MondKin得到答案。

同時對於問題的第一部分,這裏是將十進制轉換爲十六進制的遞歸方法。

import java.util.Scanner; 

public class DecimalToHexaDemo 
{ 
    char hexa[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 
    int temp; 
    String hexaDecimal = ""; 
    String hexadecimal(int num) 
    { 
     if(num != 0) 
     { 
     temp = num % 16; 
     hexaDecimal = hexa[temp] + hexaDecimal; 
     num = num/16; 
     hexadecimal(num); 
     } 
     return hexaDecimal; 
    } 

    public static void main(String[] args) 
    { 
     DecimalToHexaDemo dth = new DecimalToHexaDemo(); 
     int decimalNumber; 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Please enter decimal number: "); 
     decimalNumber = sc.nextInt(); 
     System.out.println("The hexadecimal value is : "); 
     String str = dth.hexadecimal(decimalNumber); 
     System.out.print(str); 
     sc.close(); 
    } 
} 

來源和參考 - decimal to hexadecimal java program

相關問題