进制转换问题

先说明计算机中各常用进制及其缩写:

二进制——B;
八进制——O;
十进制——D;
十六进制——H。

下面进行关于进制转换问题的具体描述:

首先,要明确的是进制的基本规则:对于k进制来说,逢k进一。

接下来,开始具体的进制转换:

k进制→10进制

设定一个十进制实数的通式:A_n...A_3A_2A_1A_0,它的值为A_n*10^n+...+A_3*10^3+A_2*10^2+A_1*10^1+A_0*10^0

对于如上形式的数,有两部分组成,一个是每一数位对应的数,即位权;一个是逢k进一的“k”,即基数。因此把k进制的数转换为10进制,就是用该进制的每一数位(假设是从后往前数第n位,注意是从0开始)乘基数的n次方,依次相加即可。

例:(1011)_B转换为十进制如下:

1*2^3+0*2^2+1*2^1+1*2^0,结果为8。

注意:最低位应是k的0次方,而不是k的n次方。

10进制→k进制

对于整数部分,采用短除法(辗转相除、除基取余,基即为基数):

将十进制数除以k,得商和余数,再用商除以k,得新商和新余数,以此类推(无余数写0)。

注意:对于十六进制,为防止混乱,定义10=A,11=B,13=C,14=D,15=F。

二进制→八进制、十六进制

通常情况下,多种不同进制之间的大小比较均转化为十进制;

特别的,二进制、八进制、十六进制之间的相互比较可以不转化为十进制,具体方法如下:

我们将一个二进制数,如101110010,分成三位一组,即101 110 010,每一组中都有8中不同的可能,每种可能对应的值恰好是0~7之间的8个数,因此可以通过这种方式把每一组转化成对应的八进制,再将所有组一并输出。

例:(101110010)_B转换为八进制如下:

二进制101对应八进制5,二进制110对应八进制6,二进制010对应八进制2;

结果为562。

注意:分组一定要从后往前,若遇到最后一组不够三个,在前面用0补位。

转换为16进制,同理,唯一的变化为四位一组,不作赘述。

八进制、十六进制→二进制

以每个数位分割,分别将其转换为对应的二进制数,再输出。

拓展:小数的进制转化

十进制→k进制:“乘k取整,顺序排列”,

即用k乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。

k进制→十进制:

方法同整数的进制转化,只是将正次幂改为负次幂。

附:OpenJudge NOI 进制类问题 1.5 25 求特殊的自然数

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int i,j,k;
	for(i=1;i<7;i++)
	{
		for(j=0;j<7;j++)
		{
			for(k=0;k<7;k++)
			{
				if(i * 49 + j * 7 + k==k * 81 + j * 9 + i)
				{
					cout<<i*49+j*7+k<<endl;
					cout<<i<<j<<k<<endl;
					cout<<k<<j<<i<<endl;
				}
			}
		}
	}
	return 0;
}

注意:最高位i要从1开始!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值