構造-05.有理数平均(20)

3382 ワード


構造-05.有理数平均(20)
時間の制限
400 ms
メモリ制限
65536 kB
コード長制限
8000 B
クイズルーチン
Standard
作成者
ジョリン(清華大学)
本題ではプログラムを作成し,N個の有理数の平均値を計算することを要求する.
入力形式:
1行目に正の整数N(<=100)を入力し、2行目に「a 1/b 1 a 2/b 2......」の形式でN個の分数形式の有理数を与え、分子と分母は整形範囲内の整数である.負の数であれば、負の番号は必ず一番前に現れる.
出力フォーマット:
1行において「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 
// #include 
// #include 
// #include 
// #include 
// 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 
#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
", r.n); else if (r.d == 1) printf("%d
", r.n); else printf("%d/%d
", r.n, r.d); return 0; }