|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
|
|
// 函数:将单个字符转换为对应的数值
|
|
|
|
|
int charToVal(char c) {
|
|
|
|
|
if (c >= '0' && c <= '9') return c - '0';
|
|
|
|
|
else if (c >= 'A' && c <= 'F') return c - 'A' + 10;
|
|
|
|
|
else if (c >= 'a' && c <= 'f') return c - 'a' + 10;
|
|
|
|
|
else return -1; // 非法字符
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 函数:将数值转换为对应的字符
|
|
|
|
|
char valToChar(int val) {
|
|
|
|
|
if (val >= 0 && val <= 9) return '0' + val;
|
|
|
|
|
else return 'A' + val - 10;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 函数:将字符串形式的数从fromBase进制转换为十进制
|
|
|
|
|
int convertToDecimal(char *num, int fromBase) {
|
|
|
|
|
int len = strlen(num);
|
|
|
|
|
int power = 1; // 表示当前位的权重
|
|
|
|
|
int numDecimal = 0; // 存放结果的十进制数
|
|
|
|
|
|
|
|
|
|
for (int i = len - 1; i >= 0; i--) {
|
|
|
|
|
int val = charToVal(num[i]);
|
|
|
|
|
if (val < 0 || val >= fromBase) {
|
|
|
|
|
printf("输入错误: 你所输入的数 %c 不是 %d进制\n", num[i], fromBase);
|
|
|
|
|
return -1; // 如果有非法字符,则返回 -1
|
|
|
|
|
}
|
|
|
|
|
numDecimal += val * power;
|
|
|
|
|
power *= fromBase; // 计算权重
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return numDecimal;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 函数:将十进制数转换为toBase进制的字符串形式
|
|
|
|
|
void convertFromDecimal(int numDecimal, int toBase, char *result) {
|
|
|
|
|
int index = 0; // 指示result数组中的当前位置
|
|
|
|
|
if (numDecimal == 0) {
|
|
|
|
|
result[index++] = '0'; // 特例处理零
|
|
|
|
|
}
|
|
|
|
|
while (numDecimal > 0) {
|
|
|
|
|
int remainder = numDecimal % toBase;
|
|
|
|
|
result[index++] = valToChar(remainder);
|
|
|
|
|
numDecimal /= toBase;
|
|
|
|
|
}
|
|
|
|
|
result[index] = '\0'; // 添加字符串结束符
|
|
|
|
|
|
|
|
|
|
// 反转字符串
|
|
|
|
|
for (int i = 0; i < index / 2; i++) {
|
|
|
|
|
char temp = result[i];
|
|
|
|
|
result[i] = result[index - i - 1];
|
|
|
|
|
result[index - i - 1] = temp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
char num[20];
|
|
|
|
|
int fromBase, toBase;
|
|
|
|
|
char result[20];
|
|
|
|
|
|
|
|
|
|
printf("请输入数字: ");
|
|
|
|
|
scanf("%s", num);
|
|
|
|
|
printf("请输入当前数字的进制(2 to 16): ");
|
|
|
|
|
scanf("%d", &fromBase);
|
|
|
|
|
printf("请输入您预期得到数字的进制(2 to 16): ");
|
|
|
|
|
scanf("%d", &toBase);
|
|
|
|
|
|
|
|
|
|
// 转换为十进制
|
|
|
|
|
int numDecimal = convertToDecimal(num, fromBase);
|
|
|
|
|
if (numDecimal < 0) {
|
|
|
|
|
return 1; // 如果转换出错则直接返回
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 转换为目标进制
|
|
|
|
|
convertFromDecimal(numDecimal, toBase, result);
|
|
|
|
|
printf("转化后的数字: %s\n", result);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|