您的位置:首页 > 其它

大数的加法

2013-10-26 23:55 134 查看
【题目介绍】  

  大数的加法,一般的处理方法都是用字符串操作,今天来处理带小数的大数加法。

  题目链接: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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: