KY79 浮点数加法

文章展示了如何在C语言中通过字符串操作实现两个浮点数的加法,涉及整数和小数部分的处理,适用于AC(AlgorithmCompetitions)场景。

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

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

输入:
0.111111111111111111111111111111
0.111111111111111111111111111111

输出:
0.222222222222222222222222222222

知识点: 字符串
AC代码:

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

#define MAX 100

void fenli(char n[], char nint[], char ndec[]) {
    int i;
    int j = 0, k = 0;
    for(i = 0; i < strlen(n); i ++) {
        if(n[i] == '.') {
            i ++;
            break;
        }
        nint[j ++] = n[i];
    }
    nint[j] = '\0';
    for( ; i < strlen(n); i ++) {
        ndec[k ++] = n[i];
    }
    ndec[k] = '\0';
}

int main() {
    char a[MAX], b[MAX];
    char aint[MAX], adec[MAX], bint[MAX], bdec[100];
    while(scanf("%s%s", a,b) != EOF) {
        fenli(a, aint, adec);
        fenli(b, bint, bdec);
        // 扩充小数
        int adec_len = strlen(adec), bdec_len = strlen(bdec);
        int dec_len;
        if(adec_len > bdec_len) {
            for(int i = bdec_len; i < adec_len; i ++) {
                bdec[i] = '0';
            }
            dec_len = adec_len;
        }
        else if(adec_len < bdec_len){
            for(int i = adec_len; i < bdec_len; i ++) {
                adec[i] = '0';
            }
            dec_len = bdec_len;
        }
        else 
            dec_len = adec_len;
        // 计算小数
        int dec_sum[MAX] = {0};
        int jw = 0;
        for(int i = dec_len - 1; i >= 0; i --) {
            dec_sum[i] = (adec[i] - '0' + bdec[i] - '0' + jw) % 10;
            jw = (adec[i] - '0' + bdec[i] - '0' + jw) / 10;
        }
        // 扩充整数
        int aint_len = strlen(aint), bint_len = strlen(bint);
        int cha, int_len;
        if(aint_len > bint_len) {
            cha = aint_len - bint_len;
            for(int i = bint_len - 1; i >= 0; i --)
                bint[i + cha] = bint[i];
            for(int i = 0; i < cha; i ++)
                bint[i] = '0';
            int_len = aint_len;
        }
        else if(aint_len < bint_len){
            cha = bint_len - aint_len;
            for(int i = aint_len - 1; i >= 0; i --)
                aint[i + cha] = aint[i];
            for(int i = 0; i < cha; i ++)
                aint[i] = '0';
            int_len = bint_len;
        }
        else 
            int_len = aint_len;
        // 计算整数
        int int_sum[MAX] = {0};
        int zsjw = jw;
        for(int i = int_len - 1; i >= 0; i --) {
            int_sum[i] = (aint[i] - '0' + bint[i] - '0' + zsjw) % 10;
            zsjw = (aint[i] - '0' + bint[i] - '0' + zsjw) / 10;
        }
        //打印
        if(zsjw)
            printf("%d", zsjw);
        for(int i = 0; i < int_len; i ++)
            printf("%d", int_sum[i]);
        printf(".");
        for(int i = 0; i < dec_len; i ++)
            printf("%d", dec_sum[i]);

    }
    return 0;
}
在数值计算中,相近数相减常常会引起严重的舍入误差,特别是在使用Matlab这样的工具进行科学计算时。为了处理这类问题,推荐参考《数值计算方法实验:Matlab实现与误差分析》一书,该书通过实验的方式详细讲解了如何在Matlab环境中设计算法以最小化这类误差,并且还包括了如何利用秦九韶算法优化计算步骤的具体案例。 参考资源链接:[数值计算方法实验:Matlab实现与误差分析](https://wenku.youkuaiyun.com/doc/40j9ky89w3?spm=1055.2569.3001.10343) 首先,关于舍入误差,当在Matlab中计算相近数相减的操作,例如`z = 10; z1 = z + 1 - z;`时,虽然直观上`z1`应该等于`1`,但由于浮点数的表示精度有限,实际结果可能会有细微的偏差。为了避免这种情况,可以采用数值分析中的一些技巧,比如利用适当的数学变换来减小数值变化的幅度,或者直接使用高精度的数值格式。 其次,秦九韶算法是一种高效的多项式求值方法,它利用了霍纳法则(Horner's rule)的思想,通过减少计算次数来简化计算步骤。例如,在Matlab中,多项式`P(x) = a_0x^n + a_1x^(n-1) + ... + a_n`在`x=1.00037`处的值可以通过直接展开计算,但这样做会涉及到大量的乘法和加法操作。而使用秦九韶算法,我们可以将多项式重写为嵌套形式`P(x) = (((a_n)x + a_{n-1})x + ... + a_1)x + a_0`,这样就可以将多项式的计算转化为重复的一次运算,显著减少了计算量。在Matlab中实现秦九韶算法时,可以通过数组来存储多项式系数,并利用循环来高效地进行计算。 总结来说,为了避免相近数相减带来的舍入误差,可以在算法设计时考虑数值的稳定性,同时使用秦九韶算法优化计算步骤,提高计算效率。更多关于这些概念的实现细节和Matlab代码示例,可以参阅《数值计算方法实验:Matlab实现与误差分析》,该书为理解数值计算方法提供了宝贵的实践经验和深入分析。 参考资源链接:[数值计算方法实验:Matlab实现与误差分析](https://wenku.youkuaiyun.com/doc/40j9ky89w3?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值