开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」第5天,点击查看活动详情 今年的蓝桥杯第一题是进制转化
问9进制下的2022的10进制数是多少,对于没学过或者遗忘了知识的人可能有点麻烦。
我们先来了解下啥叫做进制:
对于任何一种进制---X进制,就表示每一位上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位
引自百度百科
也就是说,对于一个X进制的数,它在表示时显示的数码的是从0~X-1 ,当它某个位上的数字达到X时便往更高一位进1。
举个栗子,对于一个9进制数 (2022)。我们尝试将它转化为10进制数,也就是最符合我们平时计数习惯的进制。
X进制转为10进制
我们可以以10进制标准来模拟这个转化过程。
(2022)10
| 2 | 0 | 2 | 2 |
|---|---|---|---|
| 千位数 | 百位数 | 十位数 | 个位数 |
(2022)10=2 * + 0 * +2 * +2 *
因此我们也可以把(2022)9转化为类似的样子
| 2 | 0 | 2 | 2 |
|---|---|---|---|
所以=2 * +0 * +2 * +2 * =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动态数组来存每一位的数字,在此就不过多赘述。