messiuuuu 2023-12-11 17:57 采纳率: 95.2%
浏览 2
已结题

有理数均值相关的问题

输入第一行给出正整数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
最后有一个测试点说最大N没过,后来看了其他人的代码说这个测试点没过说明没考虑化简分数分子是零的情况。却还是没过。

#include<stdio.h>
#include<stdlib.h>
int verify(int sum,int t);
void sim(int *a,int *b,int k);

int main()
{
    int n,i,j,k,t=1,sum=0;
    int a[100],b[100];
    
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d/%d",&a[i],&b[i]);
        sim(a,b,i);
        t*=b[i];
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(j==i) continue;
            a[i]*=abs(b[j]);
        }
        sum+=a[i];
    }
    t=t*n;
    k=verify(sum,t);
    if(t==sum) printf("%d",1);
    else if(k==1) printf("%d/%d",sum,t);
    else if(t/k==1||sum==0) printf("%d",sum/k);
    else printf("%d/%d",sum/k,t/k);
    
    return 0;
}
int verify(int sum,int t)
{
    int i,flag=1;
    if(sum!=0)
    {
        for(i=sum;i>=2;i--)
    {
        if(sum%i==0&&t%i==0)
        {
            flag=i;
            break;
        }
    }
    return flag;
    }
}
void sim(int *a,int *b,int k)
{
    int i;
    if(a[k]!=0)
    {
        for(i=a[k];i>=2;i--)
    {
        if(abs(a[k])%i==0&&abs(b[k])%i==0&&b[k]!=0)
        {
            a[k]=a[k]/i;
            b[k]=b[k]/i;
            break;
        }
    }
    }
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月19日
    • 创建了问题 12月11日

    悬赏问题

    • ¥15 解决一个加好友限制问题 或者有好的方案
    • ¥15 关于#java#的问题,请各位专家解答!
    • ¥15 急matlab编程仿真二阶震荡系统
    • ¥20 TEC-9的数据通路实验
    • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
    • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
    • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
    • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
    • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
    • ¥30 求解达问题(有红包)