输入两个非负 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,输出栈内元素,效果相同;
*/