7-31 有理数均值
题目描述:
本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入与输出样例:
错误思路分析:
这道题一开始的时候想将全部分母通分,然后将分子也通分,然后求出分子与分母的最小公倍数,然后相除,但这样试过很多次,然后一直在测试点二和三一直在运行超时。
正确思路分析:
这道题可以通过一个一个去通分,2个通分后得到新数据,然后与第三个数继续通分,最后得到完全通分后,最后让分母乘以数据的数目,最后得到均值,废话不多说,直接上代码。
代码块:
#include<stdio.h>
int lemon(int a,int b)//通分,找出最小公倍数
{
return b==0?a:lemon(b,a%b);
}
int main()
{
int a,b,c,d=0,e=0,h,g;
scanf("%d",&a);//输入数据的数目
h=a;
while(a--)
{
scanf("%d/%d",&b,&c);
if(d==0)//当输入第一个数据,用d与e来代替
{
d=b;
e=c;
}
else//当第二个数据与第一个数据通分后
{
d=d*c+b*e;
e=e*c;
}
if(a==0)//当输入到最后一个数据后,直接相乘数据数目得平均值
{
e=e*h;
}
b=d>0?d:-d;//该的负数是只在分子上,所以只要判断分子就行了
c=e;
g=lemon(c,d);//得到最小公倍数
d=d/g;//分母通分
e=e/g;//分子通分
}
if(d==0)//当通分后,分子为0,就直接输出0
{
printf("0");
}
else if(e==1)//当分母为1,直接输出分子
{
printf("%d",d);
}
else//当分母不为1和分子不为0时,2个都输出。
printf("%d/%d",d,e);
}