构造-05. 有理数均值(20)

结构-05. 有理数均值(20)

结构-05. 有理数均值(20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
乔林(清华大学)

本题要求编写程序,计算N个有理数的平均值。

输入格式:

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

输出格式:

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

输入样例1:
4
1/2 1/6 3/6 -5/10
输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1

下面代码的错误之处在于试图将已经变成小数的数字再变成分数!

应该保留原来的分数形式,否则在变小数时有四舍五入,最后的double 在循环小数的时候不可能变成分数,因为无线循环有四舍五入!

#include <cstdio>
// #include <iostream>
// #include <string>
// #include <sstream>
// #include <cmath>
// using namespace std;
// //求最大公约数:
// int gcd(long long a, long long b)
// {
//     if (a < b)
//     {
//         a = a + b;
//         b = a - b;
//         a = a - b;
//     }
//     long long t;
//     while (b != 0)
//     {
//         t = a % b;
//         a = b;
//         b = t;
//     }
//     return a;
// }

// void PrintFenshu(double num)  //输出分数
// {
//     int a = (int)num;
//     double b = num - a; //小数部分
//     //下面计算有几位小数
//     ostringstream strs;
//     strs << b;
//     string str = strs.str();
//     int len = str.size() - 2;
//     long long n = pow(10, len); //真分数的分母
//     long long x = b * n, y = n;
//     long long X, Y; //最终的分子分母
//     X = x + a * y;
//     Y = y;
//     //接下来求最大公约数
//     int GCD = gcd(X, Y);
//     cout << X / GCD << "/" << Y / GCD << endl;
// }

// struct n
// {
//     int a;
//     int b;
//     //    double val = a * 1.0 / b; 这样赋值是错误的!!!!a,b还不知道
// } num[100];

// int main()
// {
//     int N;
//     cin >> N;
//     double sum = 0;
//     for (int i = 0; i < N; ++i)
//     {
//         scanf("%d/%d", &num[i].a, &num[i].b);
//         sum += num[i].a * 1.0 / num[i].b;
//     }
//     sum /= N;
//     cout << sum << endl;
//     PrintFenshu(sum);
//     return 0;
// }



下面是网上找来的一个代码,他没有变成小数,直接同分来做,最后分子分母同时除以最大公约数

#include <stdio.h>
#define N 100
struct Rational
{
    int n;  /* 分子 */
    int d;  /* 分母 */
};
int gcd(int m, int n)   /* 求最大公约数 */
{
    int r;
    if (m == 0 && n == 0)
        return 0;
    if (m == 0)
        return n;
    if (n == 0)
        return m;
    while (1)
    {
        r = m % n;
        if (r == 0)
            break;
        m = n;
        n = r;
    }
    return n;
}
int main(void)
{
    struct Rational ra[N], r;
    int i, n, g;
    scanf("%d", &n);
    for (i = 0; i < n; ++i)
        scanf("%d/%d", &ra[i].n, &ra[i].d);
    r.n = 0;
    r.d = 1;
    for (i = 0; i < n; ++i)
    {
        r.n = r.n * ra[i].d + r.d * ra[i].n;
        r.d = r.d * ra[i].d;
    }
    r.d *= n;   /*平均值 */
    g = gcd(r.n, r.d);
    if (g != 0)
    {
        r.n /= g;
        r.d /= g;
    }
    if (r.n == 0)
        printf("%d\n", r.n);
    else if (r.d == 1)
        printf("%d\n", r.n);
    else
        printf("%d/%d\n", r.n, r.d);
    return 0;
}