構造-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; }