浮点数加法

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

struct bigNum{
    int left[1000];
    int right[1000];
    int size1;
    int size2;

    void init(){
        for(int i=0;i<1000;++i){
            left[i]=0;
            right[i]=0;
        }
        size1=0;
        size2=0;

    }

    void setX(char *str){
        init();
        int len=strlen(str);
        int nn=1;

        //找到小数点位置pi
        int pi=0;
        for(;pi<len&&str[pi]!='.';++pi){

        }

        //整数部分
        int c=1;
        for(int i=pi-1;i>=0;--i){
            left[size1] += (str[i]-'0')*c;
            if(c==1000){
                c=1;
                size1++;
            }
            else{
                c=c*10;
            }

        }
        if(c!=1){
            size1++;
        }

        //小数部分
        c=1000;
        for(int i=pi+1;i<len;++i){
            right[size2] = right[size2]+(str[i]-'0')*c;
            if(c==1){
                c=1000;
                size2++;
            }
            else{
                c=c/10;
            }
        }
        if(c!=1000){
            size2++;
        }
    }

    bigNum operator + (const bigNum &A)const{
        bigNum ret;
        ret.init();

        int size=max(size2,A.size2);

        //cout<<"size: "<<size<<endl;

        int c=0;
        for(int i=size-1;i>=0;--i){
            int tmp=right[i]+A.right[i]+c;
            c=tmp/10000;
            tmp=tmp%10000;
            ret.right[i]=tmp;
            //cout<<"ret right: "<<ret.right[i]<<endl;
        }

        for(int i=0;i<size1||i<A.size1;++i){
            int tmp=left[i]+A.left[i]+c;
            c=tmp/10000;
            tmp=tmp%10000;
            ret.left[ret.size1++]=tmp;
        }
        if(c!=0){
            ret.left[ret.size1++]=c;
        }

        bool flag=false;
        for(int i=0;i<size;++i){
            if(ret.right[i]!=0){
                flag=true;
                ret.size2=i;
            }
        }
        if(flag){
            ret.size2++;
        }
        else{
            ret.size2=0;
        }
        return ret;
    }

    void output(){
        for(int i=size1-1;i>=0;--i){
            if(i==size1-1){
                printf("%d",left[i]);
            }
            else{
                printf("%04d",left[i]);
            }
        }
        if(size2!=0){
            cout<<".";

            for(int i=0;i<size2-1;++i){
                printf("%04d",right[i]);
            }
            int tmp=right[size2-1];
            int x=4;
            while(tmp%10==0){
                tmp=tmp/10;
                x--;
            }
            printf("%0*d",x,tmp);


        }
        printf("\n");
    }
};

int main(){

    char str1[2000];
    char str2[2000];

    while(cin>>str1>>str2){

        bigNum num1,num2;
        num1.setX(str1);
        num2.setX(str2);

        num1=num1+num2;
        num1.output();


    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值