05. 有理数均值(20)

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

输入格式:

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

输出格式:

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

输入样例1:41/2 1/6 3/6 -5/10输出样例1:1/6输入样例2:24/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 100struct 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);elseprintf("%d/%d\n", r.n, r.d);return 0;}

人生难免有挫折,但你是逃避不了的,一定要去面对它

05. 有理数均值(20)

相关文章:

你感兴趣的文章:

标签云: