原题:
输入两个非负 10 进制整数 A 和 B (≤230 −1),输出 A+B 的 D (1<D≤10)进制数。
输入格式:
输入在一行中依次给出 3 个整数 A、B 和 D。
输出格式:
输出 A+B 的 D 进制数。
输入样例:
123 456 8
输出样例:
1103
代码:
#include <iostream>
#include <stack>
using namespace std;
int main(){
int a,b,d;
cin>>a>>b>>d;
stack<int> s;
int sum = a+b;
while(sum){
s.push(sum%d);
sum/=d;
}
if(s.size()!=0){
while(s.size()){
cout<<s.top();
s.pop();
}
}
else cout<<"0"<<endl;
}
解释:
测试点2和4:
是因为int的是32位的,正数最大范围就是231-1。题目给出的操作数范围是230 −1,如果是10进制的话还可以,但是题目里面有做进制转换,所以使用int、long long int都是不行的,要借用数组或者别的结构进行输出(我用的是stack,先进先出正好符合需求)。
C语言中int的取值范围为:-2147483648 ~ 2147483647
解释如下:
int类型在C语言中占4个字节,即32个二进制位。 当表示正数时,最高位bai为符号位(符号位为0),最大的正数是 0111 1111
1111 1111 1111 1111 1111 1111 即2^31 -1 = 2147483647
当表示负数时,最高位为符号位(符号位为1),最小的负数是 1000 0000 0000 0000 0000 0000 0000 0000
而在计算机中是以补码的形式存储的,C语言规定 1000 0000 0000 0000 0000 0000 0000 0000
的补码为-2147483648 所以C语言中int的取值范围为:-2147483648 ~ 2147483647
测试点3:
测试A=B=0,输出0。
最开始用int做输出的时候没发现这个问题,换做stack之后要加一个判断才行。