HDU 1753 大明A+B (大正小数加法、字符串处理)
发布时间:2020-12-15 05:23:57 所属栏目:Java 来源:网络整理
导读:大明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 ? 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名
大明A+BTime Limit: 3000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others) ? Problem Description?
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。 现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。 ? Input?
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。 ? Output?
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
? Sample Input1.1 2.9 1.2222222222 2.3444323343 1 1.1 Sample Output4 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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |