标签:
结构-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