1022 D进制的A+B

输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1<D≤10)进制数。

输入格式:

输入在一行中依次给出 3 个整数 A、B 和 D。

输出格式:

输出 A+B 的 D 进制数。

输入样例:

123 456 8
 

输出样例:

1103
 

/*
这里数字相加,我第一时间想到两个办法,一个是用字符串,然后转为转为数组,逆序存放,
下标对应幂,或者是用栈,逐位加,这里两种方法都要用一个变量存放进位;当前
位置的两数相加减去D就是当前位置结果,进位变为1,为了统一编码,这里第一次两个数
没有进位数进行相加,我们设置进位为0,再进行相加;然后我选用字符串加数组的形式,这样
比较方便;

补充:
注意这里给的AB是10进制数;输出A+B后的D进制数,这里A和B不是D进制数;
这里A+B不超过2的31次方,可以用int表示;第一次我以为数D进制的A和B相加
搞错了;

短除法:这里将10进制转化n进制,可以用短除法;比如将123转化为2进制数,我们类比
10进制数考虑,123=1*pow(10,2)+2*pow(10,1)+3*pow(10,0);
这里012对应位数,123/10=12余3,这里的余数就是当前最低位,接着除
12/10=1余2,这里2就是当前最低位,然后1/10=0余1,这个余数就是前最低位1
然后被除数变为0,短除结束,这里注意最先找到的低位是最后输出,那么结果就是
123,可以考虑用栈的形式来写;
然后再看10进制数123转为2进制数;
123/2=61余1,最低位为1;
61/2=30余1, 最低位为1;
30/2=15余0, 最低位为0;
15/2=7余1,  最低位为1;
7/2=3余1,   最低位为1;
3/2=1余1,   最低位为1;
1/2=0余1,   最低位为1;
此时被除数为0,倒序输出结果;
1111011就是123的2进制形式;
可以用栈,也可以用递归的形式,这里递归结束就是被除数变为0,这里注意分析的时候
123/2=61余1,实际代码中123/61=1;这里还要算一步余数;
余数=123-61*2;
8
8/2=4余0
4/2=2余0
2/2=1余0
1/2=0余1
1000

这里除以D其实就是进位;因为你满D就进位,所以一个数除以D得到的余数就是最低位,商就
是高位的D的个数;然后用商除以D,不足D的就留在D位,新的商又是新的高位D的个数;
*/
#include<iostream>
#include<string>
using namespace std;
void divide(int result,int D){    //传入数和进制;
    if(result!=0){
        if(result/D!=0)        //这里注意最后一次余数时,商为0,传入则会输出0;所以添加一个限制条件;
        divide(result/D,D);
    }
    cout<<result-(result/D)*D;
}
int main(){
    int A,B,D;
    cin>>A>>B>>D;
    int result=A+B;
    //这里就是将结果result转化为D进制数;这里可以用短除法;
    divide(result,D);
    cout<<endl;
    return 0;
}
/*
反思:一开始走了弯路,我以为时D进制A+B;因此还用了数组,后面发现时将A+B的结果转为D进制,这里用到一个
短除法,可以多思考一下,比较简单,但非常实用;我采用的递归的形式,也可以用非递归的形式,借用栈存放余数
最后商变为0,输出栈内元素,效果相同;
*/

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值