#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");
}