7-35 有理数均值(20 分)
本题要求编写程序,计算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>
int max(int p, int q);
int min(int p, int q);
void add(int *numerator, int *denominator, int next_numerator, int next_denominator);
int main()
{
int denominator, numerator, max_number;
int next_denominator,next_numerator;
int n,i;
numerator = 0;
denominator = 1;
scanf("%d",&n);
for(i = 0; i < n; i++)
{
scanf("%d/%d",&next_numerator,&next_denominator);
add(&numerator, &denominator, next_numerator, next_denominator);
max_number = max(numerator, denominator); // 如果max()中的两个数顺序相反会出错
denominator /= max_number;
numerator /= max_number;
}
denominator *= n;
max_number = max(numerator, denominator);
denominator /= max_number;
numerator /= max_number;
if(denominator == 1)
printf("%d",numerator);
else
printf("%d/%d",numerator,denominator);
return 0;
}
int max(int p, int q)
{
int r;
while(p % q != 0)
{
r = p % q;
p = q;
q = r;
}
return q;
}
int min(int p, int q)
{
return p * q / max(p, q);
}
void add(int *numerator, int *denominator, int next_numerator, int next_denominator)
{
int mcm;
mcm = min(*denominator, next_denominator);
*numerator = (*numerator) * (mcm / *denominator); // 如果不加括号会出错
next_numerator = next_numerator * (mcm / next_denominator);
*numerator = *numerator + next_numerator;
*denominator = next_denominator = mcm;
}