5-35 有理數均值 (20分)
阿新 • • 發佈:2019-01-02
本題要求編寫程式,計算N個有理數的平均值。
輸入格式:
輸入第一行給出正整數N(≤100);第二行中按照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
#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() { struct Rational ra[N], r;/*先一段開闢結構體記憶體,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; /*算得平均值:分母*n,分式縮小1/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; }