先说明计算机中各常用进制及其缩写:
二进制——B;
八进制——O;
十进制——D;
十六进制——H。
下面进行关于进制转换问题的具体描述:
首先,要明确的是进制的基本规则:对于k进制来说,逢k进一。
接下来,开始具体的进制转换:
k进制→10进制
设定一个十进制实数的通式:,它的值为;
对于如上形式的数,有两部分组成,一个是每一数位对应的数,即位权;一个是逢k进一的“k”,即基数。因此把k进制的数转换为10进制,就是用该进制的每一数位(假设是从后往前数第n位,注意是从0开始)乘基数的n次方,依次相加即可。
例:转换为十进制如下:
,结果为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个数,因此可以通过这种方式把每一组转化成对应的八进制,再将所有组一并输出。
例:转换为八进制如下:
二进制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开始!