#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>
int 文本到整数(char * p_输入) { int l_几位数 = strlen(p_输入); int l_结果 = 0; int i = 0; if (p_输入[0] == '-') { i = 1; }
for (; i < l_几位数; i++) { int l_倍数 = 1; for (size_t ii = i; ii < (l_几位数 - 1); ii++) { l_倍数 = l_倍数 * 10; } l_结果 = l_结果 + (p_输入[i] - 48)*l_倍数; } if (p_输入[0] == '-') { return -l_结果; }
return l_结果;}
char 十进制数字转十六进制字符(int l_十进制) { char l_十六进制字符 = 0; switch (l_十进制) { case 10: l_十六进制字符 = 'A'; break; case 11: l_十六进制字符 = 'B'; break; case 12: l_十六进制字符 = 'C'; break; case 13: l_十六进制字符 = 'D'; break; case 14: l_十六进制字符 = 'E'; break; case 15: l_十六进制字符 = 'F'; break; } return l_十六进制字符;}int 十六进制字符转十进制数字(char p_十六进制字符) { int l_十进制 = 0; switch (p_十六进制字符) { case 'A': l_十进制 = 10; break; case 'B': l_十进制 = 11; break; case 'C': l_十进制 = 12; break; case 'D': l_十进制 = 13; break; case 'E': l_十进制 = 14; break; case 'F': l_十进制 = 15; break; } return l_十进制;}
void f_进制转换(int p_原始进制, char *p_原始数据, int p_目标进制, char *p_目标数据) { if ((p_原始进制 >= 2 && p_原始进制 <= 16) && (p_目标进制 >= 2 && p_目标进制 <= 16)) {
//不管什么进制,一进入函数,一律转换为十进制. int l_十进制 = 0; int l_次方 = 0; if (p_原始进制 == 10) { l_十进制 = 文本到整数(p_原始数据); } else { l_次方 = strlen(p_原始数据) - 1; for (size_t i = 0; i < strlen(p_原始数据); i++) { if (p_原始数据[i] >= 48 && p_原始数据[i] <= 57) { l_十进制 = l_十进制 + (p_原始数据[i] - 48)*pow(p_原始进制, l_次方); } else {l_十进制 = l_十进制 + 十六进制字符转十进制数字(p_原始数据[i])*pow(p_原始进制, l_次方); } l_次方--; }
}
//利用求余法,转换进制,但输出结果都是反的. int l_商, l_余数, l_备份商; char l_反转目标进制[33] = { 0 }; int l_索引 = 0; l_备份商 = l_十进制;do { l_商 = l_备份商 / p_目标进制; l_余数 = l_备份商 % p_目标进制; l_备份商 = l_商; if (l_余数 >= 0 && l_余数 <= 9) { l_反转目标进制[l_索引] = l_余数 + 48; } else { l_反转目标进制[l_索引] = 十进制数字转十六进制字符(l_余数); }
l_索引++;
} while (l_商 != 0); l_反转目标进制[l_索引] = '\0';
//开始进行反转 l_索引 = 0; for (int i = strlen(l_反转目标进制) - 1; i >= 0; i--) { p_目标数据[l_索引] = l_反转目标进制[i]; l_索引++; } p_目标数据[l_索引] = '\0';
}
#include<stdio.h>
#include<stdlib.h>#include<string.h>#include<math.h>int 转换(char *输入) { int 几位数 = strlen(输入) - 1; int 结果; for (int i = 0; i < 几位数; i++) { int 倍数 = 1; for (int ii = 0; ii < 几位数 - i; ii++) { 倍数 = 倍数 * 10; } 结果 = 结果 + (输入[i] - 48) * 倍数; } return 结果;}int 转十进制字母(char 字母) { int 十进制 = 0; switch (字母) { case 'A': 十进制 = 10; break; case 'B': 十进制 = 11; break; case 'C': 十进制 = 12; break; case 'D': 十进制 = 13; break; case 'E': 十进制 = 14; break; case 'F': 十进制 = 15; break; } return 字母;}void 进制转换(char *原始数据, int 原始进制, int 目标进制, char *输出数据) { int 输出 = 0; int 次方 = strlen(原始数据) - 2; //二进制转换十进制 //10111B = 1x24 + 0x23 + 1 x22 + 1 x21 + 1 x20 = 23 //十六进制转换十进制 //125H = 1×162+2×161+5×160=293D if (目标进制 == 10) {
输出 = atoi(原始数据);
} else {
for (int i = 0; i < strlen(原始数据) - 1; i++)
{
if (原始数据[i] >= 48 && 原始数据[i] <= 57)
{
输出 = 输出 + (原始数据[i] - 48)*pow(目标进制, 次方);
} else { 输出 = 输出 + 转十进制字母(原始数据[i] - 48)*pow(目标进制, 次方); } 次方--; } } printf("%d\n", 输出);
}
void main() { char 原始数据[100] = { 0 }; char 原始进制[5] = { 0 }; char 目标进制[5] = { 0 }; char 输出数据[100] = { 0 }; printf("原始数据"); fgets(原始数据, sizeof(原始数据), stdin); printf("原始进制"); fgets(原始进制, sizeof(原始进制), stdin); printf("目标进制"); fgets(目标进制, sizeof(目标进制), stdin); 进制转换(原始数据, atoi(原始进制), atoi(目标进制), 输出数据); system("pause");}