《算法笔记》笔记之笔记 - 3、入门模拟(5) - 进制转换

16 篇文章 0 订阅
16 篇文章 0 订阅

3.5 进制转换

我们一般只要知道如何将一个x进制的数转换成十进制,和十进制如何转换成x进制数即可。若是想要将P进制的数转换成Q进制的数,我们可以先将P进制的数转换成十进制,然后将十进制转换成Q进制。

  1. 将P进制转换成十进制

对于一个十进制的数,如123456,我们可以写成下面的形式:
( 123456 ) 10 = 1 ∗ 1 0 5 + 2 ∗ 1 0 4 + 3 ∗ 1 0 3 + 4 ∗ 1 0 2 + 5 ∗ 1 0 1 + 6 ∗ 1 0 0 (123456)_{10} = 1*10^5 + 2*10^4 + 3*10^3 + 4*10^2 + 5*10^1 + 6*10^0 (123456)10=1105+2104+3103+4102+5101+6100
每个数字对应的10的指数都是自己从右开始数的位置数减一。比如6从右边开始数位于这个数的第一个位置,所以它的指数是 1 − 1 = 0 1-1=0 11=0

同样的,对于 P P P进制的数 x = a n a n − 1 a n − 2 ⋯ a 2 a 1 x=a_na_{n-1}a_{n-2} \cdots a_2a_1 x=anan1an2a2a1想转换成十进制,我们可以照葫芦画瓢:
( y ) 10 = a n ∗ P n − 1 + a n − 1 ∗ P n − 2 + a n − 2 ∗ P n − 3 + ⋯ + a 2 ∗ P 1 + a 1 ∗ P 0 (y)_{10} = a_n*P^{n-1} + a_{n-1}*P^{n-2} + a_{n-2}*P^{n-3} + \cdots + a_2*P^1 + a_1*P^0 (y)10=anPn1+an1Pn2+an2Pn3++a2P1+a1P0
这个转换我们可以简单的用循环来实现:

// y用来存储最终转换成的十进制数
// product会在循环中不断乘以p,得到p的次方数
int y=0, product=1;
// x就是要转换的p进制数,当x还有位数没有处理就进入循环中
while(x != 0){
    // 获得x的最后一位数,进行转换
    y = y + (x%10) * product;
    // 处理之后去掉x的最后一位数
    x = x / 10;
    // 得到下一个位数的p的次方数
    product = product * p;
}
  1. 将十进制转换为Q进制

这里采用“除基取余法”来实现转换。所谓的“基”就是进制Q,我们每次将十进制数除以Q,然后将余数作为最终Q进制数的低位进行存储,而商则继续除以Q并进行以上操作。当商为0时,将最终Q进制数进行从高到低输出就得到要求的Q进制数。

比如,将十进制数11转换成二进制:

代码实现如下:
// 数组z用来存放余数,num用来记录当前余数的位置
// 由于这里是从0开始按顺序存放余数,
// 所以输出的时候必须从最高位开始从右往左输出余数
int z[40], num=0;
// 由于这里需要先做除法再判断商是否为0,且十进制数可能是0,
// 所以用do……while循环更方便,能将结果0也存储下来
do{
    // 存储每一次除法的余数
    // 这里y为十进制数,Q表示要转换成的数为Q进制
    z[num++] = y % Q;
    // 保留每一次除法之后的商
    y = y / Q;
}while(y != 0);
【PAT B1022】D进制的A+B

题目描述:

输入两个非负十进制整数 A A A B B B ≤ 2 30 − 1 \leq 2^{30} - 1 2301)以及 D D D(进制数),输出 A + B A+B A+B D D D 1 < D ≤ 10 1 < D \leq 10 1<D10)进制数。

输入格式:

在一行中依次给出三个整数 A A A B B B D D D(进制数)。

输出格式:

A + B A+B A+B D D D进制数。

样例输入:

123 456 8

样例输出:

1103

思路:

先计算两个十进制数的和,然后将和转换为D进制。这里可以用到上面说的“除基取余法”。

参考代码:

#include <cstdio>

int main(){

    // a和b为十进制加数,D为要转换为的进制数
    int a, b, D;
    scanf("%d%d%d", &a, &b, &D);

    // c存储a和b的和
    int c = a+b;
    // num数组存储余数,indx用来方便记录余数的个数
    int num[31], indx=0;

    // "除基取余法"
    do{
        num[indx++] = c % D;
        c = c / D;
    }while(c != 0);

    // 从高到低输出余数,即为要转换成的D进制数
    for(int i=indx; i>0; i--){
        printf("%d", num[i-1]);
    }
    // 输出个换行符估计要好看些。。。
    printf("\n");

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值