十进制转其他进制间的转换

本文详细介绍了如何使用C语言实现十进制数(整数和小数)转换为二进制、八进制和十六进制,包括整数部分的除法取余和小数部分的乘法取整算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进制间的转换

十进制转二进制,即整数部分除二取余,小数部分乘二取整

十进制转八进制,即整数部分除八取余,小数部分乘八取整

十进制转十六进制,即整数部分除十六取余,小数部分乘十六取整

1. 十进制转二进制 

#include<stdio.h>
#include<math.h>
#define N 200   // 宏定义,定义个数   
int main() 
{
	double number;
	printf("十进制:");
	scanf_s("%lf", &number);      //  输入十进制数值

	int DEC = (int)number;        //  十进制整数部分 
	double xDEC = number - DEC;   //  十进制小数部分  

	int length = 0;               //  定义二进制整数长度
	int length1 = 0;              //  定义二进制小数长度

	int Din[N];                   //  定义存放二进制整数的数组
	int xDin[N];                  //  定义存放二进制小数的数组
	
	double Din_sum = 0;           //  定义二进制整数数值
	double xDin_sum = 0;          //  定义二进制小数数值
	
	double sum;
	double temp = 0;              //  定义中间变量

	while (DEC)                   //  整数计算,循环除2,把余数存储在数组中
	{
		Din[length] = DEC % 2;
		length++;
		DEC = DEC / 2;
	}
	while (xDEC)                  //  小数计算,进行乘二取整计算
	{
		temp = xDEC * 2;
		xDin[length1] = (int)temp;
		length1++;
		xDEC = temp - (int)temp;  //  得出其小数值
	}
	printf("二进制:");

	if ((int)number != 0 && xDEC == 0)          //  二进制整数部分计算
	{
		for (int i = length - 1; i >= 0; i--)   //  二进制整数部分将余数从下往上输出
		{
			printf("%d", Din[i]);
		}
	}

	else if ((int)number == 0 && (number - (int)number) != 0)   //  二进制小数部分计算
	{
		for (int i = 0; i < length1; i++)       //二进制整数部分将整数从上往下输出
		{
			printf("%d", xDin[i]);
		}
	}

	else   //  十进制带小数计算  (另一种方法即添加 . ,并非转换为数值相加 . 即, printf("%d",Din[i]);printf(".");printf("%d",xDin[i]);进行拼接
	{
		for (int i = length - 1; i >= 0; i--)   //二进制整数部分将余数从下往上输出
		{
			Din_sum = Din_sum + Din[i] * pow(10, i);
		}
		for (int i = 0; i < length1; i++)       //二进制整数部分将整数从上往下输出
		{
			xDin_sum = xDin_sum + xDin[i] * pow(10, -(i + 1));
		}
		sum = Din_sum + xDin_sum;
		printf("%lf", sum);
	}
	return 0;
}

 2. 十进制转八进制 

#include<stdio.h>
#include<math.h>
#define N 200   // 宏定义,定义个数   
int main() 
{
	double number;
	printf("十进制:");
	scanf_s("%lf", &number);      //  输入十进制数值

	int DEC = (int)number;        //  十进制整数部分 
	double xDEC = number - DEC;   //  十进制小数部分  

	int length = 0;               //  定义八进制整数长度
	int length1 = 0;              //  定义八进制小数长度

	int Oct[N];                   //  定义存放八进制整数的数组
	int xOct[N];                  //  定义存放八进制整数的数组
	
	double Oct_sum = 0;           //  定义八进制整数数值
	double xOct_sum = 0;          //  定义八进制小数数值
	
	double sum;
	double temp = 0;              //  定义中间变量

	while (DEC)                   //  整数计算,循环除8,把余数存储在数组中
	{
		Oct[length] = DEC % 8;
		length++;
		DEC = DEC / 8;
	}
	while (xDEC)                  //  小数计算,进行乘8取整计算
	{
		temp = xDEC * 8;
		xOct[length1] = (int)temp;
		length1++;
		xDEC = temp - (int)temp;  //  得出其小数值
	}
	printf("二进制:");

	if ((int)number != 0 && xDEC == 0)          //  八进制整数部分计算
	{
		for (int i = length - 1; i >= 0; i--)   //  八进制整数部分将余数从下往上输出
		{
			printf("%d", Oct[i]);
		}
	}

	else if ((int)number == 0 && (number - (int)number) != 0)   //  八进制小数部分计算
	{
		for (int i = 0; i < length1; i++)       // 八进制整数部分将整数从上往下输出
		{
			printf("%d", xOct[i]);
		}
	}

	else   //  十进制带小数计算  (另一种方法即添加 . ,并非转换为数值相加 . 即, printf("%d",Oct[i]);printf(".");printf("%d",xOct[i]);进行拼接
	{
		for (int i = length - 1; i >= 0; i--)   //八进制整数部分将余数从下往上输出
		{
			Oct_sum = Oct_sum + Oct[i] * pow(10, i);
		}
		for (int i = 0; i < length1; i++)       //八进制整数部分将整数从上往下输出
		{
			xOct_sum = xOct_sum + xOct[i] * pow(10, -(i + 1));
		}
		sum = Oct_sum + xOct_sum;
		printf("%lf", sum);
	}
	return 0;
}

3. 十进制转十六进制 

#include<stdio.h>
#include<string>
#define N 20000
int main()
{
	double number;               //  定义输入
	printf("十进制:");
	scanf_s("%lf", &number);

	int DEC = number;            //  得出十进制整数部分
	double xDEC = number - DEC;

	int temp;                    //  十进制整数部分中间变量
	int temp1;                   //  十进制小数部分中间变量

	int length = 0;              //  十进制整数部分长度
	int length1 = 0;             //  十进制小数部分长度

	char Hex[N] = { 0 };         //  定义十六进制整数部分数组
	char xHex[N] = { 0 };        //  定义十六进制小数部分数组

	while (DEC)                  //  十进制整数部分转换为十六进制
	{
		temp = DEC % 16;         //  除16取余,根据余数选择相应值
		switch (temp)
		{
		case 0: Hex[length] = '0'; break;
		case 1: Hex[length] = '1'; break;
		case 2: Hex[length] = '2'; break;
		case 3: Hex[length] = '3'; break;
		case 4: Hex[length] = '4'; break;
		case 5: Hex[length] = '5'; break;
		case 6: Hex[length] = '6'; break;
		case 7: Hex[length] = '7'; break;
		case 8: Hex[length] = '8'; break;
		case 9: Hex[length] = '9'; break;
		case 10: Hex[length] = 'A'; break;
		case 11: Hex[length] = 'B'; break;
		case 12: Hex[length] = 'C'; break;
		case 13: Hex[length] = 'D'; break;
		case 14: Hex[length] = 'E'; break;
		case 15: Hex[length] = 'F'; break;
		default:
			break;
		}
		length++;    //  计算个数
		DEC = DEC / 16;
	}

	while (xDEC)    //十进制小数部分转换为十六进制
	{
		temp1 = xDEC * 16;   //  乘16取整
		switch (temp1)
		{
		case 0: xHex[length] = '0'; break;
		case 1: xHex[length] = '1'; break;
		case 2: xHex[length] = '2'; break;
		case 3: xHex[length] = '3'; break;
		case 4: xHex[length] = '4'; break;
		case 5: xHex[length] = '5'; break;
		case 6: xHex[length] = '6'; break;
		case 7: xHex[length] = '7'; break;
		case 8: xHex[length] = '8'; break;
		case 9: xHex[length] = '9'; break;
		case 10: xHex[length] = 'A'; break;
		case 11: xHex[length] = 'B'; break;
		case 12: xHex[length] = 'C'; break;
		case 13: xHex[length] = 'D'; break;
		case 14: xHex[length] = 'E'; break;
		case 15: xHex[length] = 'F'; break;
		default:
			break;
		}
		length++;
		xDEC = xDEC * 16 - temp1;
	}

	printf("十六进制:");
	if ((int)number != 0 && number - (int)number == 0)
	{
		for (int i = length - 1; i >= 0; i--)   //将余数从下往上输出
		{
			printf("%c", Hex[i]);
		}
	}

	else if ((int)number == 0 && number - (int)number != 0)
	{
		for (int i = 0; i < length; i++)   //将整数从上往下输出
		{
			printf("%c", xHex[i]);
		}
	}

	else
	{
		for (int i = length - 1; i >= 0; i--)   //将余数从下往上输出
		{
			printf("%c", Hex[i]);
		}

		printf(".");

		for (int i = 0; i < length; i++)   //将整数从上往下输出
		{
			printf("%c", xHex[i]);
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值