九度OJ-1137-浮点数加法

该博客介绍了如何处理两浮点数相加的问题,详细阐述了浮点数的表示形式,并提供了样例输入和输出。针对2008年北京大学软件所研究生机试真题,解释了求解浮点数相加的算法思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2…Pi.Q1Q2…Qj
对于整数部分,P1P2…Pi是一个非负整数
对于小数部分,Qj不等于0
输入:
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
每组测试数据之间有一个空行,每行数据不超过100个字符
输出:
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
样例输入:
2
0.111111111111111111111111111111
0.111111111111111111111111111111

10000000.655555555555555555555555555555
1.444444444444444444444444444445
样例输出:
0.222222222222222222222222222222
10000002.1
来源:
2008年北京大学软件所计算机研究生机试真题

#include <stdio.h>
#include <string.h>
struct bigInteger{
    int digit_zhengshu[1000];
    int size_zhengshu;
    int digit_xiaoshu[1000];
    int size_xiaoshu;

    void init(){
        for (int i = 0; i < 1000; ++i)
        {
            digit_zhengshu[i]=0;
            digit_xiaoshu[i]=0;

        }
        size_xiaoshu=0;
        size_zhengshu=0;
    } 
    void set(char str[]){
        init();
        int len = strlen(str),t,sum,tmp,count,i;

        for (i = 0; i < len; ++i)//find '.'
            if (str[i]=='.')
                    break;
        tmp = i;//'.'的位置
        i--;
        sum = 0;
        t=1;//权重
        count = 0;
        //处理整数
        for (int j = i; j >= 0; j--)
        {
            sum+=(str[j]-'0')*t;
            t*=10;
            count++;
            if (count==4||j==0)
            {
                digit_zhengshu[size_zhengshu++]=sum;
                sum=0;
                t=1;
                count=0;
            }
        }
        //处理小数
        i=tmp+1;
        for (int j = i; j < len; ++j)
            digit_xiaoshu[size_xiaoshu++]=str[j]-'0';


    }


    bigInteger operator +(const bigInteger &A) const{
        //先加小数,在加整数
        bigInteger ret;
        ret.init();
        int carry=0,max,sum;

        if (size_xiaoshu>=A.size_xiaoshu)
        {
            max = size_xiaoshu;
        }else 
            max = A.size_xiaoshu;


        for (int i = max -1; i >= 0; i--)
        {
            sum = digit_xiaoshu[i]+A.digit_xiaoshu[i]+carry;
            ret.digit_xiaoshu[i]=sum%10;
            carry=sum/10;
        }

        for (int i = max-1; i >= 0; i--)
        {
            if (ret.digit_xiaoshu[i]!=0)
            {

                ret.size_xiaoshu=i+1;
                break;
            }
        }

        for (int i = 0; i < size_zhengshu||i<A.size_zhengshu; ++i)
        {
            sum=digit_zhengshu[i]+A.digit_zhengshu[i]+carry;
            ret.digit_zhengshu[ret.size_zhengshu++]=sum%10000;
            carry=sum/10000;
        }
        if (carry)
            ret.digit_zhengshu[ret.size_zhengshu++]=carry;
        return ret;
    }

    void print(){
        //输出整数
        for (int i = size_zhengshu-1; i >= 0; --i)
        {
            if (i==size_zhengshu-1)
                printf("%d",digit_zhengshu[i]);
            else 
                printf("%04d",digit_zhengshu[i]);
        }
        printf(".");
        if (size_xiaoshu==0)

            printf("0");
        else
            for (int i = 0; i < size_xiaoshu; ++i)
                printf("%d", digit_xiaoshu[i]);
        printf("\n");
    }
};
int main(){
    freopen("input.txt","r",stdin);
    int n,i;
    bigInteger a,b,c;
    char str1[200],str2[200];
    while(scanf("%d",&n)!=EOF){
        for (int i = 0; i < n; ++i){
            scanf("%s%s",str1,str2);
            a.set(str1);
            b.set(str2);
            c=a+b;
            c.print();

        }

    }
    return 0;
}
































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值