7-35 有理数均值 (20 分)
在做这个题的时候,开始的时候一直用for循环来找公因子,但是第三个测试点一直过不去。
然后我在网上搜搜了搜资料发现,我和AC的不同只是在寻找约数的方法上,他们用的是辗转相除法来求最大公约数,我修改程序后成功通过。
AC 代码
#include <stdio.h>
#include <stdlib.h>
int divsor(int a,int b);
int main()
{
int n;
int g;
int mol[100] = {0};
int deno[100] = {0};
int mol0=0,deno0=1;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d/%d",&mol[i],&deno[i]);
for(int i=0;i<n;i++){
mol0 = mol0*deno[i] + mol[i]*deno0;
deno0 = deno0*deno[i];
g = divsor(mol0,deno0);
mol0 /= g;
deno0 /= g;
}
deno0 *= n;
g = divsor(mol0,deno0);
mol0 /= g;
deno0 /= g;
if(mol0 == 0)
printf("%d\n", mol0);
else if(deno0 == 1)
printf("%d\n", mol0);
else
printf("%d/%d\n", mol0, deno0);
//printf("%d\n",gcd(480,2880));
return 0;
}
int divsor(int a,int b)
{
int max,min;
while(1){
if(a == 0 || b == 0) return 1;
max = (a>b)?a:b;
min = (a>b)?b:a;
a = max%min;
b = min;
if(a == 0 || b == 0) return (a>b)?a:b;
else if(max%min == max) return 1;
}
}