這個問題在這里已經有了答案: 在 Java 中從一種基數轉換為另一種基數 (10 個回答) 8 小時前關閉。
問題提示:修改 Binary 得到一個程式,該程式接受兩個整數命令列引數 i 和 k,并將 i 轉換為基數 k。假設 i 是 Java 的 long 資料型別中的整數,k 是 2 到 16 之間的整數。對于大于 10 的基數,分別使用字母 A 到 F 表示第 11 到 16 位數字。
我已經成功地將小數轉換為基數 2-10,但我似乎無法通過包含分別代表第 11 到 16 位的字符 A 到 F 來轉換小數。
我不想使用任何陣列或串列。我知道我的 switch 陳述句缺少可以解決我的問題的功能,但我不確定如何改進它。我正在嘗試使用 switch 陳述句解決問題。
在代碼中,i 表示要轉換為基數 k 的整數。k 表示可以是 2-16 的基數。
public class BaseConversion
{
public static void main(String[] args)
{
int i = Integer.parseInt(args[0]);
int k = Integer.parseInt(args[1]);
int power = 1;
while (power <= i/k)
{
power *= k;
} // Now power is the largest power of k <= i.
if (k <= 10)
{
while (power > 0)
{
int digit = i / power;
System.out.print(digit);
i -= digit * power;
power /= k;
}
}
else if (k > 10)
{
switch (k)
{
case 11: System.out.println('A'); break;
case 12: System.out.println('B'); break;
case 13: System.out.println('C'); break;
case 14: System.out.println('D'); break;
case 15: System.out.println('E'); break;
case 16: System.out.println('F'); break;
}
}
}
}
uj5u.com熱心網友回復:
如果您需要使用單個 switch 陳述句將整數(以 10 為基數)轉換為任何其他基數,您可以使用以下內容:
int i = //take from CLI
int k = //take from CLI
int num = i; //copy so we still have the original input
//we need a string to represent anything but base-10 integers
StringBuilder sb = new StringBuilder();
//decompose the input
while( num > 0 ) {
//extract the last digit
int digit = num % k;
//map the digit to a character - note: this is NOT k but the digit we extracted from the input
switch(digit) {
case 0,1,2,3,4,5,6,7,8,9:
sb.append(digit);
break;
case 10:
sb.append("A");
break;
case 11:
sb.append("B");
break;
case 12:
sb.append("C");
break;
case 13:
sb.append("D");
break;
case 14:
sb.append("E");
break;
case 15:
sb.append("F");
break;
}
//reduce the magnitude of the number by 1, i.e. divide by the base
num /= k;
}
//we extracted the digits from the back so we need to reverse the string for proper left-to-right output
String result = sb.reverse().toString();
這應該讓你開始。請注意,它缺少一些檢查,例如 k 是否在 [2,16] 范圍內。到目前為止,它還適用于正數,但可以通過將數字乘以 -1 并在轉換前將符號添加到字串緩沖區來輕松處理負輸入。
uj5u.com熱心網友回復:
提供的代碼中有幾個問題:
- 負值被忽略
switch陳述句中的數字應向下移動 1: 10 ->a, 11 ->b, .. 15 ->f- 缺少對字串的轉換,代碼正在一一列印數字
因此,StringBuilder應該使用 a 來累積結果。如果輸入為負,則應附加減號并反轉符號,然后使用模數計算數字k并以相反的順序插入到結果中。
private static String convert(long n, int k) {
assert(2 <= k && k <= 16);
StringBuilder sb = new StringBuilder();
int p = 0;
if (n < 0) {
sb.append('-');
n *= -1;
p = 1;
}
while (n > 0) {
int digit = (int) (n % k);
n /= k;
if (digit < 10) {
sb.insert(p, digit);
} else {
sb.insert(p, switch(digit) {
case 10 -> 'a';
case 11 -> 'b';
case 12 -> 'c';
case 13 -> 'd';
case 14 -> 'e';
default -> 'f'; // the only remaining option
});
}
}
return sb.toString();
}
類似地,結果可能會被收集到 aString而不是StringBuilder。但是,一般不推薦這種方法(回圈中的字串連接):
private static String convert(long n, int k) {
String s = "";
String sign = "";
if (n < 0) {
sign = "-";
n *= -1;
}
while(n > 0) {
int digit = (int) (n % k);
n /= k;
if (digit < 10) {
s = digit s;
} else {
s = switch(digit) {
case 10 -> 'a';
case 11 -> 'b';
case 12 -> 'c';
case 13 -> 'd';
case 14 -> 'e';
default -> 'f';
} s;
}
}
return sign s;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/402546.html
標籤:
