HDU 1753 大明A+B (大正小数加法、字符串处理)
大明A+B
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 16711 Accepted Submission(s): 6202
Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
Sample Input
1.1 2.9 1.1111111111 2.3444323343 1 1.1
Sample Output
4 3.4555434454 2.1
题目分析
带小数的大数加法,我们只需要将整数部分和小数部分分别相加 然后处理进位即可
但是需要注意的是:
- 小数的加法与整数略有不同,它是左对齐的,短的需要在右边补零
- 要注意输出的时候多余的0和小数点要舍弃
- 输入的时候有可能存在 .123的情况 也就是整数部分为0,但是没有直接写出来的情况
代码
#include<bits/stdc++.h> using namespace std; string a,b; int i,ia,ib; string bigadd(string a,string b) { int jin=0,i; char ai,bi; string anss; int lena=a.size(); int lenb=b.size(); if(lena>lenb) anss=a; else anss=b; int lenmax=max(lena,lenb); int p=lena-1; int q=lenb-1; for(i=lenmax-1;i>=0;i--) { if(p<0) ai='0'; else ai=a[p]; if(q<0) bi='0'; else bi=b[q]; anss[i]=((ai-'0'+bi-'0'+jin)%10)+'0'; jin=(ai-'0'+bi-'0'+jin)/10; p--; q--; } if(jin) { char x=jin+'0'; anss=x+anss; } return anss; } int main() { while(cin>>a>>b) { int lena=a.size(); int lenb=b.size(); ia=lena; ib=lenb; for(i=0;i<lena;i++) { if(a[i]=='.') ia=i; } for(i=0;i<lenb;i++) { if(b[i]=='.') ib=i; } string prea(a,0,ia); //整数部分 if(prea.empty()) prea="0"; string preb(b,0,ib); if(preb.empty()) preb="0"; string la="0"; //小数部分 if(ia!=lena) la=a.substr(ia+1); string lb="0"; if(ib!=lenb) lb=b.substr(ib+1); string presum=bigadd(prea,preb); if(la.size()>lb.size()) //补0 { string bu(la.size()-lb.size(),'0'); lb=lb+bu; } if(la.size()<lb.size()) { string bu(lb.size()-la.size(),'0'); la=la+bu; } string lsum=bigadd(la,lb); if(lsum.size()>max(la.size(),lb.size())) //处理进位 { string jin=lsum.substr(0,lsum.size()-max(la.size(),lb.size())); lsum=lsum.substr(lsum.size()-max(la.size(),lb.size())); presum=bigadd(presum,jin); } for(i=lsum.size()-1;i>=0;i--) //处理多余的0 { if(lsum[i]!='0') break; lsum.erase(i); } if(lsum.empty()) cout<<presum<<endl; else cout<<presum<<'.'<<lsum<<endl; } }