HDU 1753 大明A+B (大数加法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1753





#include <iostream>
#include <string>

using namespace std;

int findpoint(string str) //找到小数点在字符串中的位置
{
    int i;
    for(i=0; i<(int)str.length(); i++)
    {
        if(str[i]=='.')
            return i;
    }
    return i;
}

string IntegerAdd(string s1,string s2,int point1,int point2) //将整数部分相加,返回结果
{
    string a=s1.substr(0,point1);
    string b=s2.substr(0,point2);

    if(point1<point2) //确保a为较长的串
    {
        string tempstr;
        int temp;

        tempstr=a;
        a=b;
        b=tempstr;

        temp=point1;
        point1=point2;
        point2=temp;
    }

    for(int i=(int)a.length()-1,j=(int)b.length()-1; j>=0; i--,j--)//将b的每一位与‘0’的差值加到a中
    {
        a[i]+=b[j]-'0';
    }

    for(int i=a.length()-1; i>=1; i--)  //处理进位---加法是从右往左算的,进位也是
    {
        if(a[i]>'9')
        {
            a[i-1]++;
            a[i]-=10;
        }
    }

    if(a[0]>'9')
    {
        a[0]-=10;
        a='1'+a;
    }

    return a;
}

string DecimalAdd(string &s1,string &s2,int point1,int point2)
{

    //取小数点后的字符串
    string a;
    if(point1<(int)s1.length()-1)
        a=s1.substr(point1+1,s1.length()-1-point1);

    string b;
    if(point2<(int)s2.length()-1)
        b=s2.substr(point2+1,s2.length()-1-point2);

    //确保a为较长的串
    if(s1.length()-point1<s2.length()-point2)
    {
        string tempstr;
        int temp;

        tempstr=a;
        a=b;
        b=tempstr;

        temp=point1;
        point1=point2;
        point2=temp;
    }

    /*
    这里要注意,string.length()是unsigned类型,与int类型的j计算时,如果j是负数,会转化为比较大的无符号值,
    所以要对它进行类型强转
    */
    for(int i=0,j=0; j<=(int)b.length()-1; i++,j++)  //从前往后,确保小数位对齐
    {
        a[i]+=b[j]-'0';
    }

    for(int i=a.length()-1; i>=1; i--)  //从后往前逐一进位,除了第一个小数位
    {
        if(a[i]>'9')
        {
            a[i-1]++;
            a[i]-=10;
        }
    }

    if(a[0]>'9')  //判断第一个小数位
    {
        a[0]-=10;
        s1[point1-1]++;  //原字符串小数点前一位加1
    }

    return a;
}

int main ()
{
    string s1,s2;
    int point1;
    int point2;
    string B; //小数位
    string A; //整数位
    while(cin>>s1>>s2)
    {
        point1=findpoint(s1);  //找到小数点
        point2=findpoint(s2);
        B=DecimalAdd(s1,s2,point1,point2);
        A=IntegerAdd(s1,s2,point1,point2);
        int i;
        for(i=B.length()-1; i>=0; i--)  //从后向前,找到第一个不为0的字符
            if(B[i]!='0')
                break;
        if(i<0)
            cout<<A<<endl;
        else
        {
            cout<<A<<'.';
            for(int j=0;j<=i;j++)
            cout<<B[j];
            cout<<endl;
        }


    }
    return 0;
}




转载于:https://www.cnblogs.com/zhanyeye/p/9746117.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值