5-35 有理数均值 (20分)

结构-05. 有理数均值(20)时间限制400 ms
内存限制65536 kB
代码长度限制8000 B
判题程序Standard作者乔林(清华大学)
本题要求编写程序,计算N个有理数的平均值。输入格式:输入第1行给出正整数N(输出格式:在一行中按照“a/b”的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:


自己写的有一个过不了

#include<stdio.h>

struct shu
{
	int fenzi;
	char fenhao;
	int fenmu;
}shu[100];

int main()
{	
	int x;
	while(scanf("%d",&x)!=EOF)
	{
		int i,j;
		j=0;
		for(i=0;i<x;i++)
		{
			scanf("%d%c%d",&shu[i].fenzi,&shu[i].fenhao,&shu[i].fenmu);
			if(i>0&&shu[i-1].fenmu==shu[i].fenmu)
				j++;
		}
		long int m,n;
		if(j==x-1)
		{
			m=0;
			n=shu[0].fenmu*x;
			for(i=0;i<x;i++)
				m=m+shu[i].fenzi;
			if(m==0)
				printf("0\n");
			else if(m==n)
				printf("1\n");
			else if(m%n==0)
				printf("%ld\n",m/n);
			else if(n%m==0&&n/m>0)
				printf("1/%ld\n",n/m);
			else if(n%m==0&&n/m<0)
				printf("-1/%ld\n",-n/m);
			else
			{
				if(m-1<0)
				{			
					for(i=-1-m;i>0;i--)
					{
						if(m%i==0&&n%i==0)
						{
							m=m/i;
							n=n/i;
					        printf("%ld/%ld\n",m,n);
				        	break;
						}
					}
				}
				else
				{				
					for(i=m-1;i>0;i--)
					{
						if(m%i==0&&n%i==0)
						{
							m=m/i;
							n=n/i;
					        printf("%ld/%ld\n",m,n);
				        	break;
						}
					}
				}
			}
		}
		else
		{
			n=1;
			m=0;
			for(i=0;i<x;i++)
				n=n*shu[i].fenmu;
			for(i=0;i<x;i++)
				m=m+((n/shu[i].fenmu)*shu[i].fenzi);
			n=n*x;
			if(m==0)
				printf("0\n");
			else if(m==n)
				printf("1\n");
			else if(m%n==0)
				printf("%ld\n",m/n);
			else if(n%m==0&&n/m>0)
				printf("1/%ld\n",n/m);
			else if(n%m==0&&n/m<0)
				printf("-1/%ld\n",-n/m);
			else
			{
				if(m-1<0)
				{			
					for(i=-1-m;i>0;i--)
					{
						if(m%i==0&&n%i==0)
						{
							m=m/i;
							n=n/i;
					        printf("%ld/%ld\n",m,n);
				        	break;
						}
					}
				}
				else
				{				
					for(i=m-1;i>0;i--)
					{
						if(m%i==0&&n%i==0)
						{
							m=m/i;
							n=n/i;
					        printf("%ld/%ld\n",m,n);
				        	break;
						}
					}
				}
			}
		}
	}
	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;
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值