c语言有理数均值思路,5-35 有理数均值 (20分)

结构-05. 有理数均值(20)时间限制400 ms

内存限制65536 kB

代码长度限制8000 B

判题程序Standard作者乔林(清华大学)

本题要求编写程序,计算N个有理数的平均值。输入格式:输入第1行给出正整数N(输出格式:在一行中按照“a/b”的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。输出样例1:

1/6

输入样例2:

2

4/3 2/3

输出样例2:

1

自己写的有一个过不了

#include

struct shu

{

int fenzi;

char fenhao;

int fenmu;

}shu[100];

int main()

{

int x;

while(scanf("%d",&x)!=EOF)

{

int i,j;

j=0;

for(i=0;i

{

scanf("%d%c%d",&shu[i].fenzi,&shu[i].fenhao,&shu[i].fenmu);

if(i>0&&shu[i-1].fenmu==shu[i].fenmu)

j++;

}

long int m,n;

if(j==x-1)

{

m=0;

n=shu[0].fenmu*x;

for(i=0;i

m=m+shu[i].fenzi;

if(m==0)

printf("0\n");

else if(m==n)

printf("1\n");

else if(m%n==0)

printf("%ld\n",m/n);

else if(n%m==0&&n/m>0)

printf("1/%ld\n",n/m);

else if(n%m==0&&n/m<0)

printf("-1/%ld\n",-n/m);

else

{

if(m-1<0)

{

for(i=-1-m;i>0;i--)

{

if(m%i==0&&n%i==0)

{

m=m/i;

n=n/i;

printf("%ld/%ld\n",m,n);

break;

}

}

}

else

{

for(i=m-1;i>0;i--)

{

if(m%i==0&&n%i==0)

{

m=m/i;

n=n/i;

printf("%ld/%ld\n",m,n);

break;

}

}

}

}

}

else

{

n=1;

m=0;

for(i=0;i

n=n*shu[i].fenmu;

for(i=0;i

m=m+((n/shu[i].fenmu)*shu[i].fenzi);

n=n*x;

if(m==0)

printf("0\n");

else if(m==n)

printf("1\n");

else if(m%n==0)

printf("%ld\n",m/n);

else if(n%m==0&&n/m>0)

printf("1/%ld\n",n/m);

else if(n%m==0&&n/m<0)

printf("-1/%ld\n",-n/m);

else

{

if(m-1<0)

{

for(i=-1-m;i>0;i--)

{

if(m%i==0&&n%i==0)

{

m=m/i;

n=n/i;

printf("%ld/%ld\n",m,n);

break;

}

}

}

else

{

for(i=m-1;i>0;i--)

{

if(m%i==0&&n%i==0)

{

m=m/i;

n=n/i;

printf("%ld/%ld\n",m,n);

break;

}

}

}

}

}

}

return 0;

}

参考

#include

#define N 100

struct Rational

{

int n; /* 分子 */

int d; /* 分母 */

};

int gcd(int m, int n) /* 求最大公约数 */

{

int r;

if (m == 0 && n == 0)

return 0;

if (m == 0)

return n;

if (n == 0)

return m;

while (1)

{

r = m % n;

if (r == 0)

break;

m = n;

n = r;

}

return n;

}

int main(void)

{

struct Rational ra[N], r;

int i, n, g;

scanf("%d", &n);

for (i = 0; i < n; ++i)

scanf("%d/%d", &ra[i].n, &ra[i].d);

r.n = 0;

r.d = 1;

for (i = 0; i < n; ++i)

{

r.n = r.n * ra[i].d + r.d * ra[i].n;

r.d = r.d * ra[i].d;

}

r.d *= n; /*平均值 */

g = gcd(r.n, r.d);

if (g != 0)

{

r.n /= g;

r.d /= g;

}

if (r.n == 0)

printf("%d\n", r.n);

else if (r.d == 1)

printf("%d\n", r.n);

else

printf("%d/%d\n", r.n, r.d);

return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值