C语言程序修复:解决大数乘法导致的溢出问题

问题描述:

在进行多个分式的乘法运算时,程序在输入以下数据时依然会报错:

7
100000000 1
100000000 1
100000000 1
100000000 1
1 100000000
1 100000000
1 100000000

运行结果应当是100000000,而实际运行结果与这不符。

问题分析:

问题的出现是因为在累乘分子和分母时,整数的乘法结果可能会超过 long long 类型的范围。

解决方案:

为了解决这个问题,我们可以在每次累乘之前将分子和分母分别约分到最简形式,然后再进行累乘操作。

修改后的程序:

#include <stdio.h>

long long gcd(long long a, long long b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}

int main() {
    int n;
    scanf("%d", &n);
    
    long long fz = 1, fm = 1, a, b, gcdVal;
    for (int i = 0; i < n; i++) {
        scanf("%lld %lld", &a, &b);
        gcdVal = gcd(a, b);
        a /= gcdVal;
        b /= gcdVal;
        
        // 累乘前将分子和分母分别约分到最简形式
        long long fzGcd = gcd(fz, a);
        fz /= fzGcd;
        a /= fzGcd;
        
        long long fmGcd = gcd(fm, b);
        fm /= fmGcd;
        b /= fmGcd;
        
        fz *= a;
        fm *= b;
    }
    
    if (fm == 1) {
        printf("%lld\n", fz);
    }
    else {
        printf("%lld/%lld\n", fz, fm);
    }
    
    return 0;
}

结果:

现在程序经过修改后可以正常运行,输出结果也正确表示分式的乘积。对于给定的测试数据,输出结果为 100000000。

C语言程序修复:解决大数乘法导致的溢出问题

原文地址: https://www.cveoy.top/t/topic/zH0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录