#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;
}

代码说明:

  1. 该代码首先定义了一个 gcd 函数,用于计算两个整数的最大公约数,这里使用了欧几里得算法。
  2. main 函数中,首先读取分数的个数 n
  3. 然后使用循环读取每个分数的分子和分母,并进行约分。
  4. 在循环内部,首先调用 gcd 函数计算分子和分母的最大公约数 gcdVal
  5. 然后将分子和分母分别除以 gcdVal 进行约分。
  6. 接着将约分后的分子和分母分别乘以累积的分子 fz 和分母 fm
  7. 循环结束后,fzfm 分别存储了所有分数乘积的分子和分母。
  8. 再次调用 gcd 函数计算 fzfm 的最大公约数,并将 fzfm 分别除以该最大公约数,得到最简分数形式。
  9. 最后根据分母 fm 是否为 1 判断输出结果是整数还是分数。

优化:

  • 在循环内部进行约分,可以避免分子分母过大导致溢出。
  • 使用 long long 类型存储分子分母,可以处理更大的数据范围。
  • 代码中添加了注释,方便理解。

希望以上内容能够帮助你更好地理解如何使用C语言计算多个分数的乘积。如还有其他问题,欢迎继续提问。

C语言:计算多个分数的乘积(含代码示例及优化)

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

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