输入第一行给出正整数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;
}
}
}
}