7-31 有理数均值

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);
}
发布了49 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xiaosuC/article/details/104054735