编程题 7-35 有理数均值【PAT】

编程练习题目集目录

题目

  计算 N N N 个有理数的平均值。

输入格式

  输入第一行给出正整数 N ( ≤ 100 ) N(≤100) N100;第二行中按照 a 1 / b 1 a1/b1 a1/b1 a 2 / b 2 a2/b2 a2/b2 …的格式给出 N N N 个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。

输出格式

  在一行中按照 a / b a/b a/b 的格式输出 N N N 个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为 1 1 1,则只输出分子。

输入样例1

4
1/2 1/6 3/6 -5/10

输出样例1

1/6

输入样例2

2
4/3 2/3

输出样例2

1

题解

解题思路

  输入分数的个数,然后输入分数。先将所有分数进行通分,然后进行相加,然后利用辗转相除法,算出最大公约数,然后进行约分,最后得出结论。

完整代码

#include <stdio.h>
#include<iostream>
using namespace std;

int GCD(int A, int B)               // 约分函数,求出最大公约数
{
    
    
    int t = 0;
    while(t = A % B)                // 辗转相除法
    {
    
    
        A = B;
        B = t;
    }
    return B;
}

int main(void)
{
    
    
    int a[1001], b[1001];                                   // 定义分子、分母数组
    int i = 0, A = 0, B = 1, C = 0, N;                      // A大分子,B大分母
    cout << "请输入一个正整数:";                              // 提交时注释此行
    cin >> N;
    cout << "请输入 "<< N << " 个分数:";                     // 提交时注释此行
    for (i = 1; i <= N; i++)
        scanf("%d/%d", &a[i], &b[i]);
    for (i = 1; i <= N; i++)
    {
    
    
        A = A * b[i] + a[i] * B;                            // 将每个分子通分,再相加
        B = B * b[i];                                       // 求分母的公倍数
        C = GCD(A, B);
        A /= C;
        B /= C;
    }
    B = B * N;                                              // 将分母乘以N
    C = GCD(A, B);
    A /= C;
    B /= C;
    if (B == 1)
        cout << A << endl;
    else
        cout << A << "/" << B << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41918107/article/details/143487673