C语言求多个分数的乘积(解决溢出问题)

本文将介绍如何使用C语言编写程序,计算多个分数的乘积,并重点解决计算过程中可能出现的整数溢出问题。

问题描述

给定n个分数 ai / bi,求它们的乘积。

输入:

  • 第一行:一个整数n (1 <= n <= 20),表示分数的个数。* 接下来n行:每行两个整数a, b,分别代表一个分式的分子和分母。(0 <= a, b <= 10 ^ 9, b != 0)

输出:

  • 所有分式的乘积。如果结果是整数,直接输出这个整数。否则请输出结果的最简形式。保证结果的分子和分母都在int范围内。

解决方案

直接将所有分子的乘积作为结果的分子,所有分母的乘积作为结果的分母,可能会导致整数溢出。为了避免这个问题,我们可以在每次相乘之前进行约分,将相乘的结果约分到最简形式。

以下是使用C语言实现的代码: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; scanf('%d', &n); long long fz = 1, fm = 1, a, b, GCD, gcdVal; for (int i = 0; i < n; i++) { scanf('%lld %lld', &a, &b); gcdVal = gcd(a, b); a /= gcdVal; b /= gcdVal; // 在相乘之前进行约分 fz *= a; fm *= b; GCD = gcd(fz, fm); fz /= GCD; fm /= GCD; } if (fm == 1) { printf('%lld ', fz); } else { printf('%lld/%lld ', fz, fm); } return 0;}

代码解释:

  1. gcd(a, b) 函数使用辗转相除法计算两个数的最大公约数。2. 在主函数中,我们使用 fzfm 分别存储结果的分子和分母。3. 在每次循环中,我们读取一个分数的分子和分母,并进行约分。4. 然后,我们将约分后的分子和分母分别乘以 fzfm,并在每次相乘后再次进行约分,确保结果始终保持最简形式。5. 最后,根据分母是否为1,输出最终结果。

通过在每次相乘之前进行约分,我们可以有效避免整数溢出问题,并保证计算结果的正确性。

C语言求多个分数的乘积(解决溢出问题)

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

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