PTA-基础编程题目-5-35有理数的均值(c)

本文介绍了一个程序设计问题,即如何计算多个有理数的平均值,并将其以最简分数形式输出。程序使用了结构体来存储有理数,并通过求最大公约数实现了分数的简化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

本题要求编写程序,计算N个有理数的平均值。

输入格式:

输入第一行给出正整数N(≤\le100);第二行中按照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>
typedef struct node{
    int a;
    int b;
}type;
int gcd(int sum,int add);        //求最大公约数的函数 
int main(void)
{    
    int n,c;                    //c为两数的最大公约数 
    int i,j;
    int sum,add;                //sum为分子的积的和,add为分母积 
    scanf("%d",&n);
    type t[n];                //创建一个n大小的结构体数组 

    for(i=0;i<n;i++)    {
        scanf("%d/%d",&t[i].a,&t[i].b);            
    }

    if(n==1)    {
        if(t[0].a!=0)    {
            c=gcd(t[0].a,t[0].b);
            t[0].a/=c;
            t[0].b/=c;
            if(t[0].a%t[0].b==0)        //如果分母为1,则输出分子就够了 
                printf("%d\n",t[0].a/t[0].b);
            else
                printf("%d/%d\n",t[0].a,t[0].b);
            return 0;
        }    else if(t[0].a==0)    {    //输入的a为0的时候 
            printf("0\n");
            return 0;
        }    
        
    }    else {        //n大于1的时候 
        sum=t[0].a;
        add=t[0].b;
        for(i=1;i<n;i++)    {
            sum=sum*t[i].b+t[i].a*add;            //  sum=a0*b1+a1*b0, add=b0*b1;
            add=add*t[i].b;
            c=gcd(sum,add);        //c为最大公约数; 
            sum/=c;                //约分 
            add/=c;         
        }
        add*=n;                //分母乘以n,再跟分子约分; 
        c=gcd(sum,add);
        sum/=c;
        add/=c;
        if(sum%add==0)    {        // 注意输出的格式,分母为0的时候 
            printf("%d\n",sum/add);
        }    else    {
            printf("%d/%d\n",sum,add);
            return 0;
        }
    }
}
int gcd(int sum,int add)
{    
    int x,y,c;
    x=sum;y=add;
        while(sum!=0)    {
            c=add%sum; add=sum; sum=c;
        }
    c=add;
    return c;            
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值