|
|
|
@ -0,0 +1,103 @@
|
|
|
|
|
import java.util.Scanner;
|
|
|
|
|
|
|
|
|
|
public class JinZhi {
|
|
|
|
|
|
|
|
|
|
// 辅助方法:将任意进制的数转换为十进制
|
|
|
|
|
/**
|
|
|
|
|
* 将任意进制的数转换为十进制数
|
|
|
|
|
*
|
|
|
|
|
* @param number 要转换的数的字符串表示
|
|
|
|
|
* @param base 该数的原始进制
|
|
|
|
|
* @return 转换后的十进制数
|
|
|
|
|
*/
|
|
|
|
|
public static int toDecimal(String number, int base) {
|
|
|
|
|
int decimalValue = 0; // 十进制结果
|
|
|
|
|
int power = 0; // 当前位的权重(幂次)
|
|
|
|
|
|
|
|
|
|
// 从字符串的最后一个字符开始遍历
|
|
|
|
|
for (int i = number.length() - 1; i >= 0; i--) {
|
|
|
|
|
char digit = number.charAt(i); // 当前字符
|
|
|
|
|
int value = 0; // 当前字符对应的十进制值
|
|
|
|
|
|
|
|
|
|
// 根据字符计算其十进制值
|
|
|
|
|
if (Character.isDigit(digit)) {
|
|
|
|
|
value = digit - '0'; // 如果是数字,直接减去'0'的ASCII码
|
|
|
|
|
} else if (digit >= 'A' && digit <= 'F') {
|
|
|
|
|
value = digit - 'A' + 10; // 如果是大写字母,减去'A'的ASCII码后加10
|
|
|
|
|
} else if (digit >= 'a' && digit <= 'f') {
|
|
|
|
|
value = digit - 'a' + 10; // 如果是小写字母,减去'a'的ASCII码后加10
|
|
|
|
|
} else {
|
|
|
|
|
throw new IllegalArgumentException("输入的数字中包含无效字符: " + digit);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 将当前字符的十进制值乘以权重后累加到结果中
|
|
|
|
|
decimalValue += value * Math.pow(base, power);
|
|
|
|
|
power++; // 权重增加
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return decimalValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 辅助方法:将十进制数转换为任意进制
|
|
|
|
|
/**
|
|
|
|
|
* 将十进制数转换为任意进制的数
|
|
|
|
|
*
|
|
|
|
|
* @param decimalValue 要转换的十进制数
|
|
|
|
|
* @param base 目标进制
|
|
|
|
|
* @return 转换后的目标进制数的字符串表示
|
|
|
|
|
*/
|
|
|
|
|
public static String fromDecimal(int decimalValue, int base) {
|
|
|
|
|
if (decimalValue == 0) {
|
|
|
|
|
return "0"; // 如果十进制数为0,直接返回"0"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StringBuilder result = new StringBuilder(); // 用于存储转换结果的StringBuilder对象
|
|
|
|
|
char[] digits = "0123456789ABCDEF".toCharArray(); // 表示所有可能的进制字符的数组
|
|
|
|
|
|
|
|
|
|
// 使用循环进行进制转换
|
|
|
|
|
while (decimalValue > 0) {
|
|
|
|
|
int remainder = decimalValue % base; // 取余数作为当前位的值
|
|
|
|
|
result.insert(0, digits[remainder]); // 将当前位的值添加到结果的开头
|
|
|
|
|
decimalValue /= base; // 十进制数除以目标进制,为下一次循环做准备
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result.toString(); // 返回转换后的结果字符串
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 主方法:执行进制转换
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
|
Scanner scanner = new Scanner(System.in); // 创建Scanner对象用于读取用户输入
|
|
|
|
|
|
|
|
|
|
// 读取要转换的数、其原始进制和目标进制
|
|
|
|
|
System.out.print("请输入要转换的数: ");
|
|
|
|
|
String number = scanner.nextLine();
|
|
|
|
|
System.out.print("请输入该数的原始进制(2-16): ");
|
|
|
|
|
int inputBase = scanner.nextInt();
|
|
|
|
|
|
|
|
|
|
// 读取目标进制
|
|
|
|
|
System.out.print("请输入目标进制(2-16): ");
|
|
|
|
|
int targetBase = scanner.nextInt();
|
|
|
|
|
|
|
|
|
|
// 验证输入的有效性
|
|
|
|
|
if (inputBase < 2 || inputBase > 16 || targetBase < 2 || targetBase > 16) {
|
|
|
|
|
System.out.println("无效的进制。进制必须在2到16之间。");
|
|
|
|
|
return; // 如果输入无效,则直接返回,不执行后续操作
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 将输入的数转换为十进制数
|
|
|
|
|
int decimalValue = toDecimal(number, inputBase);
|
|
|
|
|
|
|
|
|
|
// 将十进制数转换为目标进制数
|
|
|
|
|
String result = fromDecimal(decimalValue, targetBase);
|
|
|
|
|
|
|
|
|
|
// 输出转换后的结果
|
|
|
|
|
System.out.println(number + "初始是" + inputBase + "进制;" + "在" + targetBase + "进制下是"+ result);
|
|
|
|
|
} catch (IllegalArgumentException e) {
|
|
|
|
|
// 捕获并处理非法参数异常
|
|
|
|
|
System.out.println("错误: " + e.getMessage());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
scanner.close(); // 关闭Scanner对象,释放资源
|
|
|
|
|
}
|
|
|
|
|
}
|