1. 程式人生 > >HDU 1753 大明A+B (大數加法)

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

#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;
}