蓝桥杯省赛真题-----轻松带你搞定进制转化🔥

170 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」第5天,点击查看活动详情 今年的蓝桥杯第一题是进制转化

问9进制下的2022的10进制数是多少,对于没学过或者遗忘了知识的人可能有点麻烦。

我们先来了解下啥叫做进制:

对于任何一种进制---X进制,就表示每一位上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位

引自百度百科

也就是说,对于一个X进制的数,它在表示时显示的数码的是从0~X-1 ,当它某个位上的数字达到X时便往更高一位进1。

举个栗子,对于一个9进制数 (2022)。我们尝试将它转化为10进制数,也就是最符合我们平时计数习惯的进制。

X进制转为10进制

我们可以以10进制标准来模拟这个转化过程。

(2022)10

2022
千位数百位数十位数个位数
10310^310210^210110^110010^0

(2022)10=2 * 10310^3+ 0 * 10210^2+2 * 10110^1+2 * 10010^0

因此我们也可以把(2022)9转化为类似的样子

2022
939^3929^2919^1909^0

所以(2022)9(2022)_9=2 * 939^3+0 * 929^2+2 * 919^1+2 * 909^0=2+18+1458=(1478)10

从上面的例子我们可以看出,把9进制转化为10进制,就是将它的每一位数字乘上它相应的倍率,然后取他们的和。

类似的,X进制转化为10进制都可以套用这个思路来做。接下来我们来讲讲具体实现。

我们可以设置如下变量

int sum=0;//转化成的十进制数
int Pow=1;//转化过程中每一位数的倍率
int N;//要转化为10进制的数
int X;//N的进制

函数实现:

int zhuanhua(int N) {
	int sum = 0,Pow=1;
	while (N) {//N是X进制数
		sum += (N % 10)*Pow;
		N /= 10;//每次加完一位数*倍率,之后就到下一位
		Pow *= X;
	}//最后sum就是N在10进制下的数啦
	return sum;
}

上面讲了X进制转为10进制,接下来我们来讲讲10进制转化为X进制该怎么办

10进制转化为X进制

我们最开始提到进制的定义是 *每一位上的数运算时都是逢X进一位。 *十进制*是逢十进一, *十六进制*是逢十六进一, *二进制就是逢二进一,以此类推,x进制就是逢x进位

十进制数倘若要转为X进制,那显然就是

如果数字不满X就保留,如果满了,就往前一位进X的倍数,并且保留不满X的部分,如果X的倍数也满X了,那就再往前进X的倍数的倍数,继续保留不满X的部分。。。如此往复,直到数不能再进位。

来个例子,(2022)10转为九进制

首先,我们算出这一轮进位中,不满9的部分 int rest=2022%9=6;

然后,我们再算出2022中有几个9,即是9的几倍。int times=2022/9=224;

把倍率进位

因此现在的(2022)9

我们发现 91 位满9了,还可以进位,所以就先算出新一轮的剩余部分 rest=times%9=8;

以及倍率 times=times/9=24

我们计算新一轮的times和rest都是用的上一轮的倍率,因此要先算rest,然后再算出新倍率更新times

(2022)9

我们继续发现92 位满9了,还可以进位,所以就先算出不满9的部分 rest=times%9=6;

以及新一轮的倍率 times=times/9=2;` 至此,times不满9,已经不能进位了,转化结束。

(2022)9

我们发现整个10进制转化为X进制的过程,就是不断地算出N(被转化数)相对于X进制的倍率,然后在X进制下的数字就是每轮进位下不满X的部分,当我们的times(倍率)不满9时,转化就此结束


以下是函数实现:

int ten_to_x(int N,int X){
    int sum=0;
    int times=N,rest=0,ans=0;
    while(times){
       int rest=times%X;
       sum=sum*10+rest;
       times/=X;
    }//sum在转化过程中是低位在前,高位在后,所以从头到尾反转一下
    //用ans来接收反转的sum
   while (sum) {
	ans = ans * 10 + sum % 10;
	sum /= 10;
   }return ans;
}

我们还可以精炼下10进制转化为X进制的代码

已经明白上面10进制转X进制过程的就可以用下面代码了

int ten_to_x(int N, int X) {
    int sum = 0,ans=0;
    while (N) {
        sum = sum * 10 + N % X;
        N /= X;
    }
    while (sum) {
        ans = ans * 10 + sum % 10;
        sum /= 10;
    }return ans;
}

当然了,还有许许多多的存储X进制数的数据结构,本人只是展示出了其中好用的一种,大家还可以用vector动态数组来存每一位的数字,在此就不过多赘述。