7-35 有理数均值 分数 20

每日一言

我们把世界看错,反说它欺骗了我们。 --飞鸟集


题目

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

输入格式:

输入第一行给出正整数N(≤100);第二行中按照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
#include
int main()
{
    int n=0;
    scanf("%d",&n);
    int i=0;
    int fz[n];
    int fm[n];
    int tmp=0;
    for(i=0;i<n;i++)
    {
        scanf("%d/%d",&fz[i],&fm[i]);
    }
    int j=0;
    long long zfm=1;
    long long zfz=0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(j!=i)
            {
                fz[i]*=fm[j];
            }
        }
        zfz+=fz[i];
        zfm*=fm[i];
    }
    zfm*=n;
    for(i=zfm;i>=2;i--)
    {
        if(zfm%i==0&&zfz%i==0)
        {
            zfm/=i;
            zfz/=i;
            break;
        }
    }
    if(zfz==0)
    {
        printf("0");
        return 0;
    }
    if(zfm==1)
        printf("%lld",zfz);
    else
    printf("%lld/%lld",zfz,zfm);
    return 0;
}

解释:

  1. 用户输入n,表示分数的个数。
  2. 定义两个数组fz和fm,用于存储分子和分母。
  3. 使用循环,依次读取每个分数的分子和分母并存储到数组中。
  4. 初始化两个变量zfz和zfm,分别表示最终的分子和分母,初始值都为0和1。
  5. 使用两个嵌套循环,计算每个分数的通分分子,并将通分分子累加到zfz上。
  6. 计算所有分数的通分分母,并将其乘以n。
  7. 使用循环,从zfm开始递减,判断zfm和zfz是否都能整除以i,如果能整除,则将两者都除以i,即化简为最简形式。
  8. 最后,根据zfz和zfm的值的不同情况,进行输出。若zfz为0,则输出0;若zfm为1,则只输出zfz;否则输出zfz和zfm的值。这段代码实现了计算n个分数的和,并化简为最简形式的功能。

偷懒只能能拿到15分
7-35 有理数均值 分数 20_第1张图片

思路二:每输入一个分数就化简一次

#include
void simp(int* x,int* y)//化简分数
{
    int tmp=*x<*y?*x:*y;
    while(tmp>1)
    {
        if(*x%tmp==0&&*y%tmp==0)
        {
            *x/=tmp;
            *y/=tmp;
            break;
        }
        tmp--;
    }
}

int main()
{
    int n =0;
    scanf("%d",&n);//输入的分数数目
    int a=0;
    int b=0;
    scanf("%d/%d",&a,&b);
    int zfz=a;
    int zfm=b;
    simp(&zfz,&zfm);//化简
    while(~scanf("%d/%d",&a,&b))
    {
        zfz=zfz*b+zfm*a;
        zfm*=b;
        simp(&zfz,&zfm);//化简
    }
    zfm*=n;//分母乘以n,来计算平均数
    simp(&zfz,&zfm);
    if(1==zfm)//如果分母为1,只打印分子就行
    {
        printf("%d",zfz);
    }
    else if(0==zfz)//如果分子为0,打印0
        printf("0");
    else
        printf("%d/%d",zfz,zfm);//正常打印
    return 0;
}

7-35 有理数均值 分数 20_第2张图片


结语

请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

编程小白写作,如有纰漏或错误,欢迎指正


你可能感兴趣的:(算法,c语言)