CUC-SUMMER-3-M

2017-08-03  本文已影响0人  Nioge
M - 大明A+B
HDU-1753

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。

Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。

Sample Input
1.1 2.9
1.1111111111 2.3444323343
1 1.1
Sample Output
4
3.4555434454
2.1


解法:高精度计算,用长度为1000的数组来存储,前500位存整数部分,后500位存小数部分,输出的情况很多需要注意。

代码:

#include<iostream>
#include<cstring>
using namespace std;

char str1[500],str2[500];
int x[1000],y[1000],z[1000];
void op()
{
    memset(x,0,sizeof(x));
    memset(y,0,sizeof(y));
    memset(y,0,sizeof(z));
    int a,b;
    a=strlen(str1);
    if(strchr(str1,'.')!=NULL){
        b=strchr(str1,'.')-str1;
        for(int i=b-1;i>=0;i--)
            x[501-b+i]=str1[i]-'0';
        for(int i=b+1;i<a;i++)
            x[500+i-b]=str1[i]-'0';
    }
    else
        for(int i=a-1;i>=0;i--)
            x[501-a+i]=str1[i]-'0';
    a=strlen(str2);
    if(strchr(str2,'.')!=NULL){
        b=strchr(str2,'.')-str2;
        for(int i=b-1;i>=0;i--)
            y[501-b+i]=str2[i]-'0';
        for(int i=b+1;i<a;i++)
            y[500+i-b]=str2[i]-'0';
    }
    else
        for(int i=a-1;i>=0;i--)
            y[501-a+i]=str2[i]-'0';
    int c=0;
    for(int i=999;i>=0;i--){
        z[i]=x[i]+y[i]+c;
        c=z[i]/10;
        z[i]%=10;
    }
}
int main()
{
    while(cin>>str1>>str2){
        op();
        int flag=0;
        int f=-1;
        for(int i=0;i<=500;i++){
            if(z[i]!=0){
                f=i;
                break;
            }
        }
        if(f==-1)
            cout<<0;
        else
            for(int i=f;i<=500;i++){
                if(z[i]!=0)
                    flag=1;
                if(flag==0)
                    continue;
                else
                    cout<<z[i];
            }
        f=-1;
        for(int i=999;i>500;i--){
            if(z[i]!=0){
                f=i;
                break;
            }
        }
        if(f!=-1){
            cout<<".";
            for(int i=501;i<=f;i++){
                cout<<z[i];
            }
        }
        cout<<endl;
    }
}
上一篇下一篇

猜你喜欢

热点阅读