问题 B: 大大的求和
时间限制: 1 Sec 内存限制: 32 MB
提交: 50 解决: 24
题目描述
小明在做小红给他出的算术题加法题,但是小红为了治一治小明懒惰的毛病,给他出的数都很大,这下小明郁闷了,想请你帮忙。
输入
输入的第一行是一个正整数N,表示一共有N组测试数据。
每组数据由1~100行正整数组成,每行正整数的长度不大于100位。
当输入0时,表示此组数据输入完毕。
输出
对于每组输入数据,输出所有数字的总和。每两组输出数据之间有一个空行。
样例输入 Copy
2 123456789012345678901234567890 123456789012345678901234567890 123456789012345678901234567890 0 12 34 0
样例输出 Copy
370370367037037036703703703670 46
代码
要点归纳:
那么运算过程或者结果要存储(以字符形式)就要使用" 数字字符-‘0’ "或 “ ‘0’+数字”;
利用栈最字符串进行反转,方便运算;
调试过程需要一部分一部分测试,而不是整个程序跑完再调试。
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stack>
#include <math.h>
using namespace std;
//'0'+十进制数字
int main(){
int n;
char sum[105];
stack <char> a,b,c;
sum[0]='0';
sum[1]='\0';
string temp;
int i=0;
char ai='0',bi='0';
int ci=0;
cin>>n;
getchar();
while(n--){
while(cin>>temp){
if(temp=="0"){
break;
}
//reverse(temp.begin(),temp.end());
i=0;
ai='0';bi='0';
ci=0;
while(sum[i]!='\0'){
a.push(sum[i]);
i++;
}
for(i = 0;i<temp.size();i++){
b.push((char)temp[i]);
}
while(!a.empty()&&!b.empty()){//加法运算
ai=a.top();
a.pop();
bi=b.top();
b.pop();
c.push((char)('0'+(ci+(ai-'0')+(bi-'0'))%10));
ci=(ci+(int)(ai-'0')+(int)(bi-'0'))/10;
}
if(a.empty()&&(!b.empty())){
while(!b.empty()){
bi=b.top();
b.pop();
c.push((char)('0'+(ci+(int)(bi-'0'))%10));
ci=(ci+(bi-'0'))/10;
}
}
else if(b.empty()&&(!a.empty())){
while(!a.empty()){
ai=a.top();
a.pop();
c.push((char)('0'+(ci+(ai-'0'))%10));
ci=(ci+(ai-'0'))/10;
}
}
if(ci>0){
c.push((char)('0'+ci));
}
ci=0;
i=0;
while(!c.empty()){
sum[i]=c.top();
c.pop();
i++;
}
sum[i]='\0';
}
int j=0;
while(sum[j]!='\0'){ //输出结果
cout<<sum[j++];
}
cout<<endl;
if(n!=0){
cout<<endl; //此处为题目要求
}
sum[0]='0';
sum[1]='\0';
}
}