算法思想:
在对于10转其他进制可以利用短除法的思想,将10进制数转换成其他进制数。,如下图所示,x为进制,num为十进制数。
1、10进制转16进制主体部分
void DecToHex(int num) //10进制转16进制
{
char str[N];
int i = 0, index;
while (num)
{
index = num % 16;
if (index < 9)
str[i] = index + '0';
else
str[i] = index-10 + 'a';
num /= 16;
i++;
}
str[i] = 0;
reverse_str(str, i); //将字符串逆序
fputs(str, stdout);
}
2、10进制转2进制主体部分
void DecToBin(int num) //10进制转2进制
{
int i = 0, index;
char str[N];
while (num)
{
index = num % 2;
str[i] = index + '0';
num /= 2;
i++;
}
str[i] = 0;
reverse_str(str, i); //将字符串逆序
fputs(str, stdout);
}
3、2进制转10进制主体部分
用num表示当前取到对应十进制数的个位,在每次取num之前需要将存放结果的变量result乘2,最后加上个位数num,每趟循环读取字符串中的字符时都执行这三步,最后result就是结果值。
int BinToDec(char* str)
{
int i = 0,num,result=0;
while (str[i]&&str[i]!='\n')
{
result <<=1; //左移1位,相当于*2
num = str[i] - '0';
result += num;
i++;
}
return result;
}
4、16进制转10进制主体部分
用num表示当前取到对应十进制数的个位,在每次取num之前需要将存放结果的变量result乘16,最后加上个位数num,每趟循环读取字符串中的字符时都执行这三步,最后result就是结果值。
int HexToDec(char* str)
{
int i = 0, num, result = 0;
while (str[i] && str[i] != '\n')
{
result <<= 4; //左移4位,相当于*16
if (str[i] >= 'a')
num = str[i] - 'a' + 10;
else
num = str[i] - '0';
result += num;
i++;
}
return result;
}
完整代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 20
void reverse_str(char* str, int len); //数组逆序
void DecToHex(int num); //10转16
void DecToBin(int num); //10转2
int BinToDec(char* str); //2转10
int HexToDec(char* str); //16转10
int main(void)
{
//int num;
//printf("输入10进制数为:");
//scanf("%d", &num);
//printf("10进制数%d在16进制下为:",num);
//DecToHex(num);
//printf("\n");
//printf("10进制数%d在2进制下为:", num);
//DecToBin(num);
//printf("\n");
char str[N];
printf("输入二进制数为:");
fgets(str, sizeof(str), stdin);
BinToDec(str);
printf("转换成十进制数为:%d\n", BinToDec(str));
memset(str, 0, sizeof(str)); //清0
printf("输入十六进制数为:");
fgets(str, sizeof(str), stdin);
HexToDec(str);
printf("转换成十进制数为:%d\n", HexToDec(str));
system("pause");
return 0;
}
void DecToHex(int num) //10进制转16进制
{
char str[N];
int i = 0, index;
while (num)
{
index = num % 16;
if (index < 9)
str[i] = index + '0';
else
str[i] = index-10 + 'a';
num /= 16;
i++;
}
str[i] = 0;
reverse_str(str, i); //将字符串逆序
fputs(str, stdout);
}
void DecToBin(int num) //10进制转2进制
{
int i = 0, index;
char str[N];
while (num)
{
index = num % 2;
str[i] = index + '0';
num /= 2;
i++;
}
str[i] = 0;
reverse_str(str, i); //将字符串逆序
fputs(str, stdout);
}
int BinToDec(char* str)
{
int i = 0,num,result=0;
while (str[i]&&str[i]!='\n')
{
result <<=1; //左移1位,相当于*2
num = str[i] - '0';
result += num;
i++;
}
return result;
}
int HexToDec(char* str)
{
int i = 0, num, result = 0;
while (str[i] && str[i] != '\n')
{
result <<= 4; //左移4位,相当于*16
if (str[i] >= 'a')
num = str[i] - 'a' + 10;
else
num = str[i] - '0';
result += num;
i++;
}
return result;
}
void reverse_str(char* str, int len)
{
int low = 0, high = len - 1;
while (low < high)
{
char temp = str[low];
str[low] = str[high];
str[high] = temp;
low++;
high--;
}
}
案例运行效果: