#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 检查输入是否合法
int isValidInput(const char *num, int base) {
if (base < 2 || base > 16) return 0;
for (int i = 0; i < strlen(num); i++) {
if (isdigit(num[i])) {
if (num[i] - '0' >= base) return 0;
} else if (isupper(num[i])) {
if (num[i] - 'A' + 10 >= base) return 0;
} else if (islower(num[i])) {
if (num[i] - 'a' + 10 >= base) return 0;
} else {
return 0;
}
}
return 1;
}
// 将给定进制的数转换为十进制
long long toDecimal(const char *num, int base) {
long long decimal = 0;
int len = strlen(num);
for (int i = 0; i < len; i++) {
int digit;
if (isdigit(num[i])) {
digit = num[i] - '0';
} else if (isupper(num[i])) {
digit = num[i] - 'A' + 10;
} else {
digit = num[i] - 'a' + 10;
}
decimal = decimal * base + digit;
}
return decimal;
}
// 将十进制数转换为目标进制
void toTargetBase(long long decimal, int targetBase, char *result) {
char digits[] = "0123456789ABCDEF";
int index = 0;
if (decimal == 0) {
result[index++] = '0';
} else {
while (decimal > 0) {
int remainder = decimal % targetBase;
result[index++] = digits[remainder];
decimal /= targetBase;
}
}
result[index] = '\0';
// 反转结果字符串
for (int i = 0, j = index - 1; i < j; i++, j--) {
char temp = result[i];
result[i] = result[j];
result[j] = temp;
}
}
int main() {
char num[100];
int fromBase, toBase;
printf("请输入原数字: ");
scanf("%s", num);
printf("请输入原进制: ");
scanf("%d", &fromBase);
printf("请输入目标进制: ");
scanf("%d", &toBase);
if (!isValidInput(num, fromBase)) {
printf("非法输入\n");
return 1;
}
long long decimal = toDecimal(num, fromBase);
char result[100];
toTargetBase(decimal, toBase, result);
printf("转换后的结果: %s\n", result);
return 0;
}