A+B+C+D
描述
温暖的签到题~ 对于输入的四个正整数,输出它们的和。
输入格式
只有一行,输入空格隔开的四个正整数A、B、C、D
输出格式
只有一行,输出A、B、C、D四个正整数的和
数据约定及其范围
对于所有数据,保证0≤A,B,C,D≤2^62
分析
unsigned long long 的表示范围在 0~2^64-1,这里的和会超过这个范围,所以不能直接加和,所以采用高精度加法(本质就是模拟加法的计算过程)
代码如下
#include<bits/stdc++.h>
using namespace std;
//大数组要在外面声明
const int maxh=50;
int s1[maxh];
int s2[maxh];
int s3[maxh];
int s4[maxh];
int main(){
string str1,str2,str3,str4;
cin>>str1>>str2>>str3>>str4;
stack<int> s;//输出时所用的栈
int flag=0;//设置进位;
//初始化
for(int i=0;i<50;i++){
s1[i]=0;
s2[i]=0;
s3[i]=0;
s4[i]=0;
}
int l1=str1.length();
int l2=str2.length();
int l3=str3.length();
int l4=str4.length();
//颠倒存放到数组中
//下面这些for循环将string类型转成int数组并颠倒存放在数组中
for(int i=0,j=l1-1;i<l1,j>=0;i++,j--){
s1[i]=str1[j]-'0';
}
for(int i=0,j=l2-1;i<l2,j>=0;i++,j--){
s2[i]=str2[j]-'0';
}
for(int i=0,j=l3-1;i<l3,j>=0;i++,j--){
s3[i]=str3[j]-'0';
}
for(int i=0,j=l4-1;i<l4,j>=0;i++,j--){
s4[i]=str4[j]-'0';
}
for(int i=0;i<50;i++){
//这两个公式不可以颠倒,第二式子对flag的值进行改变
s.push((s1[i]+s2[i]+s3[i]+s4[i]+flag)%10);
flag=(s1[i]+s2[i]+s3[i]+s4[i]+flag)/10;
}
//倒着输出,要去掉前导零
while(!s.empty()){
if(s.top()==0){
s.pop();
}else{
break;
}
}
while(!s.empty()){
cout<<s.top();
s.pop();
}
cout<<endl;
return 0;
}