结构-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

程序:

#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\n", r.n);	
	else if(r.d == 1)
		printf("%d\n", r.n);
	else
		printf("%d/%d\n", r.n, r.d);
	return 0; 
}

 

 

你可能感兴趣的:(PAT《C/C++/Java,程序设计基础》习题集)