diff --git a/computer/computer.java b/computer/computer.java index 6ff67ec..604be82 100644 --- a/computer/computer.java +++ b/computer/computer.java @@ -1,85 +1,70 @@ import java.util.Scanner; -public class computer{ +public class computer { - // 将任意进制数转换为十进制数 - public static int toDecimal(String number, int base) { - int decimal = 0; - int power = 0; + // 将任意R进制数X转换为十进制数 + public static int baseToDecimal(String x, int r) { + int decimalValue = 0; + int length = x.length(); - // 从字符串的末尾开始遍历 - for (int i = number.length() - 1; i >= 0; i--) { - char digit = number.charAt(i); + for (int i = 0; i < length; i++) { + char digit = x.charAt(length - 1 - i); // 从右往左处理 int value; - // 处理0-9的数字字符 - if (digit >= '0' && digit <= '9') { - value = digit - '0'; - } - // 处理A-F(或a-f)的十六进制字符 - else if (digit >= 'A' && digit <= 'F') { - value = digit - 'A' + 10; - } else if (digit >= 'a' && digit <= 'f') { - value = digit - 'a' + 10; + if (Character.isDigit(digit)) { + value = digit - '0'; // 数字字符 } else { - throw new IllegalArgumentException("Invalid character in number: " + digit); + value = Character.toUpperCase(digit) - 'A' + 10; // 字母字符 } - - // 根据当前字符的权重(即它在数中的位置)累加其值 - decimal += value * Math.pow(base, power); - power++; + decimalValue += value * Math.pow(r, i); } - - return decimal; + return decimalValue; } - public static String fromDecimal(int decimal, int base) { - if (base < 2 || base > 16) { - throw new IllegalArgumentException("Base must be between 2 and 16"); + // 将十进制数转换为R进制数 + public static String decimalToBase(int num, int r) { + if (num == 0) { + return "0"; } - StringBuilder number = new StringBuilder(); + StringBuilder result = new StringBuilder(); - // 当十进制数大于0时,持续转换 - while (decimal > 0) { - int remainder = decimal % base; - char digit; - - // 处理0-9 + while (num > 0) { + int remainder = num % r; if (remainder < 10) { - digit = (char) ('0' + remainder); - } - // 处理10-15(A-F) - else { - digit = (char) ('A' + (remainder - 10)); + result.append(remainder); // 数字字符 + } else { + result.append((char) ('A' + (remainder - 10))); // 字母字符 } - - number.insert(0, digit); // 在字符串的开头插入新的字符 - decimal /= base; // 更新十进制数,去掉已转换的部分 + num /= r; } - // 如果转换后的字符串为空(即输入的十进制数为0),则返回"0" - return number.length() == 0 ? "0" : number.toString(); + return result.reverse().toString(); // 反转结果 } + + // 将任意R进制数X从进制R_from转换到进制R_to + public static String convertBase(String x, int rFrom, int rTo) { + int decimalValue = baseToDecimal(x, rFrom); // 转换为十进制 + return decimalToBase(decimalValue, rTo); // 转换为目标进制 + } + public static void main(String[] args) { Scanner scanner = new Scanner(System.in); - // 输入原始进制数和目标进制 - System.out.print("输入原始数字的基数(2-16): "); - int originalBase = scanner.nextInt(); + System.out.print("请输入要转换的进制数(例如:1A):"); + String x = scanner.nextLine(); - System.out.print("输入原始数字输入要转换的基数(2-16): "); - String originalNumber = scanner.next(); + System.out.print("请输入原始进制(2-16):"); + int rFrom = scanner.nextInt(); - System.out.print("输入要转换的基数(2-16): "); - int targetBase = scanner.nextInt(); + System.out.print("请输入目标进制(2-16):"); + int rTo = scanner.nextInt(); - // 转换并输出结果 - int decimal = toDecimal(originalNumber, originalBase); - String convertedNumber = fromDecimal(decimal, targetBase); + // 调用转换函数 + String result = convertBase(x, rFrom, rTo); - System.out.println("转换后的号码是: " + convertedNumber); + System.out.printf("%s 从 %d 进制转换到 %d 进制的结果是: %s\n", x, rFrom, rTo, result); scanner.close(); } -} \ No newline at end of file +}