求有理数的平均数

本关任务:计算n(n<100)个有理数的平均数并返回,要求输出结果为最简分数形式。

测试:
输入:3
1/2 3/4 5/6
输出:25/36

测试2:
输入: 5
-1/2 2/3 -3/4 4/5 -5/6
输出:-37/300

#include <stdlib.h>
#include <stdio.h>

struct rationalNumber
 {
    int fenzi; // 分子
    int fenmu; // 分母
};

// 函数rnMean:计算n个有理数的平均数
// 参数:a-存放有理数的数组,n-有理数的个数
// 返回值:n个有理数的平均数
struct rationalNumber rnMean(struct rationalNumber a[], int n);
struct rationalNumber reduction(struct rationalNumber n);
struct rationalNumber rnAdd(struct rationalNumber x, struct rationalNumber y);
int main()
{
    char c;
    struct rationalNumber a[100],z,k;
    int n, i;
    // 输入有理数个数
    scanf("%d", &n);
    // 输入n个有理数
    for(i = 0; i < n; i++)
        scanf("%d%c%d", &a[i].fenzi, &c, &a[i].fenmu); 
    z = rnMean(a,n);     // 计算有理数平均数
    // 输出平均数
    if(z.fenmu == 1)
        printf("%d\n", z.fenzi);
    else
        printf("%d/%d\n", z.fenzi, z.fenmu);
    return 0;
}
// 找最大公约数,并对有理数分式进行化简
struct rationalNumber reduction(struct rationalNumber n)
{
int temp;
    int k,j;
    int max,min;
if(((n.fenzi)<0)&&((n.fenmu)>0))   // 分了几类,当然也能abs()是对整数取绝对值,而fabs()是对浮点数取.
{
    j = -n.fenzi;
    k = n.fenmu;
}
else if(((n.fenmu)<0) &&((n.fenzi)>0))
{
    j = n.fenzi;
    k = -n.fenmu;
}
else
{
    j = n.fenzi;
    k = n.fenmu;
}
if(k<j)
{
    temp = k;
    k = j;
    j = temp;
}
while(j!=0)				//辗转相除法?
{
    temp = k % j;
    k = j;
    j = temp;
}
n.fenzi = (n.fenzi) / k;
n.fenmu = (n.fenmu) / k;
return n;	//返回化简后的有理式(返回的与函数的类型一致)
}

struct rationalNumber rnAdd(struct rationalNumber x, struct rationalNumber y)
{
    struct rationalNumber k;
        k.fenzi = (x.fenzi) * (y.fenmu) + (x.fenmu) *(y.fenzi);  //这两行是分数加法同用的情况
        k.fenmu = (x.fenmu) * (y.fenmu);
        k = reduction(k);
    return k;
}

struct rationalNumber rnMean(struct rationalNumber a[], int n)
{
    int i;
    struct rationalNumber k;
    for(i=0;i<n-1;i++)
    {   
        a[i+1] = rnAdd(a[i],a[i+1]); //进行一个数据的叠加,此时已经化简好了。
    }
    a[i].fenmu = (a[i].fenmu) * n;

    return a[i];
}

这是个小练习,跟朋友们分享下。本人大一生,初学c语言。如果朋友们有更好的想法,欢迎和我交流哦。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael 2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值