本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数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这样有可能造成数据丢失,而应该分母乘上n然后分子分母再除去最大公因数
代码实现
#include<stdio.h>
int zuidagongyinshu(int fenzi,int fenmu){
if(fenmu==0)return fenzi;
fenzi=fenzi%fenmu;
return zuidagongyinshu(fenmu,fenzi);
}
int main(){
int n;
int a,b,fenzi=0,fenmu=1;
scanf("%d",&n);
scanf("%d/%d",&fenzi,&fenmu);
for(int i=1;i<n;i++){
scanf("%d/%d",&a,&b);
fenzi=fenzi*b+a*fenmu;
fenmu=fenmu*b;
int q=zuidagongyinshu(fenzi,fenmu);
fenzi/=q;
fenmu/=q;
}
if(fenzi==0){
printf("0");
}else if(fenmu==1){
printf("%d",fenzi/n);
}else{
fenmu*=n;
int q=zuidagongyinshu(fenzi,fenmu);
printf("%d/%d",fenzi/q,fenmu/q);
}
return 0;
}