|
|
|
@ -1,84 +1,69 @@
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|