结构-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:
内存限制65536 kB
代码长度限制8000 B
判题程序Standard作者乔林(清华大学)
本题要求编写程序,计算N个有理数的平均值。输入格式:输入第1行给出正整数N(输出格式:在一行中按照“a/b”的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1
自己写的有一个过不了
#include<stdio.h>
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<x;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<x;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<x;i++)
n=n*shu[i].fenmu;
for(i=0;i<x;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 <stdio.h>
#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;
}