标签:
结构-05. 有理数均值(20)
本题要求编写程序,计算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; }
标签:
原文地址:http://blog.csdn.net/u011545923/article/details/43818773