C语言程序修复:解决大数乘法导致的溢出问题
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。
原文地址: https://www.cveoy.top/t/topic/zH0 著作权归作者所有。请勿转载和采集!