我们把世界看错,反说它欺骗了我们。 --飞鸟集
本题要求编写程序,计算N个有理数的平均值。
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
4
1/2 1/6 3/6 -5/10
1/6
2
4/3 2/3
1
如果不懂化简可以去看
有理分式化简
点一下就可以跳转
(运行溢出)
本来想着先计算出总结果,最后再化简的,果然偷懒就拿不了满分 ┭┮﹏┭┮
#include<stdio.h>
#include<math.h>
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;
}
偷懒只能能拿到15分
#include<stdio.h>
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;
}
请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!
都看到这里啦!真棒(*^▽^*)
可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家
编程小白写作,如有纰漏或错误,欢迎指正