C语言:计算多个分数的乘积(含代码示例及优化)
#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;
// 读取分数个数
printf('请输入分数个数:');
scanf('%d', &n);
long long fz = 1, fm = 1, a, b, gcdVal;
// 循环读取每个分数
printf('请输入分子和分母,用空格隔开:\n');
for (int i = 0; i < n; i++) {
scanf('%lld %lld', &a, &b);
// 先约分再相乘,避免溢出
gcdVal = gcd(a, b);
a /= gcdVal;
b /= gcdVal;
fz *= a;
fm *= b;
}
// 计算最终结果的最大公约数
gcdVal = gcd(fz, fm);
fz /= gcdVal;
fm /= gcdVal;
// 根据分母是否为1输出结果
if (fm == 1) {
printf('结果为:%lld\n', fz);
} else {
printf('结果为:%lld/%lld\n', fz, fm);
}
return 0;
}
代码说明:
- 该代码首先定义了一个
gcd函数,用于计算两个整数的最大公约数,这里使用了欧几里得算法。 - 在
main函数中,首先读取分数的个数n。 - 然后使用循环读取每个分数的分子和分母,并进行约分。
- 在循环内部,首先调用
gcd函数计算分子和分母的最大公约数gcdVal。 - 然后将分子和分母分别除以
gcdVal进行约分。 - 接着将约分后的分子和分母分别乘以累积的分子
fz和分母fm。 - 循环结束后,
fz和fm分别存储了所有分数乘积的分子和分母。 - 再次调用
gcd函数计算fz和fm的最大公约数,并将fz和fm分别除以该最大公约数,得到最简分数形式。 - 最后根据分母
fm是否为 1 判断输出结果是整数还是分数。
优化:
- 在循环内部进行约分,可以避免分子分母过大导致溢出。
- 使用
long long类型存储分子分母,可以处理更大的数据范围。 - 代码中添加了注释,方便理解。
希望以上内容能够帮助你更好地理解如何使用C语言计算多个分数的乘积。如还有其他问题,欢迎继续提问。
原文地址: http://www.cveoy.top/t/topic/z7v 著作权归作者所有。请勿转载和采集!