Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 16711 Accepted Submission(s): 6202
1.1 2.9 1.1111111111 2.3444323343 1 1.1
4 3.4555434454 2.1
带小数的大数加法,我们只需要将整数部分和小数部分分别相加 然后处理进位即可
但是需要注意的是:
#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; } }
原文:https://www.cnblogs.com/dyhaohaoxuexi/p/11333690.html