【题目介绍】
大数的加法,一般的处理方法都是用字符串操作,今天来处理带小数的大数加法。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1753
【解题思路】
纯粹的字符串操作。重要的是要找到小数点的位置,然后以小数点为分割,将字符串分为整数部分和小数部分。然后两部分分别求和,最后再组合成一个串。
第一步:找小数点的位置。
可以用循环搞定,记录下小数点的位置x;注意:如果两个数中有整数,整数的小数点在哪儿呢,在下标=-1处^_^;
第二步:求小数部分的和。
首先要把小数部分分离出来,小数点的位置x就起作用了,把下标大于x且小于字符串a的长度的部分保存在a1里;字符串b同理。
然后a1加b1;
注意:小数部分保存后第一位是要对齐的,
例:
.234
.23456
长度不一样时,对短的是要在后面补字符‘0’。
小数部分和sum1,不要进位,但要保存是否进位的信息。
第三步:求整数部分和。
和第二步类似,不细说了。
但要注意的是:整数部分是要最后一位对齐的,
例:
1234.
45.
长度不一样时,要在短的字符前面补字符‘0’。
记整数部分和sum2,这个有进位。
第四步:求和。
如果sum1有进位,那么,sum2和字符‘1’再做有进位的加法
第五步:按要求输出
【代码】
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> using namespace std; int t; string add1(string a,string b) //小数部分求和函数 { //给不足位的串在后面补‘0’ if(a.length()>b.length()) b=b+string(a.length()-b.length(),'0'); else a=a+string(b.length()-a.length(),'0'); t=0; //进位标志 for(int i=a.length()-1;i>=0;--i) { t+=a[i]-'0'+b[i]-'0'; a[i]=t%10+'0'; t/=10; } return a; } string add2(string a,string b) //整数部分求和函数 { //给不足位的串在前面补‘0’ if(a.length()>b.length()) b=string(a.length()-b.length(),'0')+b; else a=string(b.length()-a.length(),'0')+a; int f=0; //进位标志 for(int i=a.length()-1;i>=0;--i) { f+=a[i]-'0'+b[i]-'0'; a[i]=f%10+'0'; f/=10; } return (f?'1'+a:a); } int main() { //freopen("in.txt","r",stdin); string a,b; while(cin>>a>>b) { //a,b长度 int lena = a.length(); int lenb = b.length(); //找小数点位置 int x=-1; int y=-1; for(int i=0;i<lena;i++) if(a[i]=='.') x=i; for(int i=0;i<lenb;i++) if(b[i]=='.') y=i; //小数部分加法 char a1[405]={'0'},b1[405]={'0'}; if(x!=-1) for(int i=0;i<lena;i++) { a1[i]=a[++x]; } if(y!=-1) for(int i=0;i<lenb;i++) { b1[i]=b[++y]; } string sum1=add1(a1,b1); //整数部分加法 char a2[405]={'0'},b2[405]={'0'}; for(int i=0;i<lena;i++) { if(a[i]=='.') break; a2[i]=a[i]; } for(int i=0;i<lenb;i++) { if(b[i]=='.') break; b2[i]=b[i]; } string sum2=add2(a2,b2); //输出 if(t==1) sum2=add2(sum2,"1"); //判断sum1是否有进位 //按要求化成最简形式,也即把‘0’去掉 int s=sum1.length(); for(int i=s-1;i>=0;i--) { if(sum1[i]=='.') { s--; break; } if(sum1[i]!='0') break; else s--; } if(s!=0) { cout<<sum2<<"."; for(int i=0;i<s;i++) cout<<sum1[i]; } else cout<<sum2; cout<<endl; } return 0; }