PTA-基礎程式設計題目-5-35有理數的均值(c)
阿新 • • 發佈:2018-12-30
5-35 有理數均值 (20分)
本題要求編寫程式,計算N個有理數的平均值。
輸入格式:
輸入第一行給出正整數N(≤\le≤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 解答程式: #include<stdio.h> typedef struct node{ int a; int b; }type; int gcd(int sum,int add); //求最大公約數的函式 int main(void) { int n,c; //c為兩數的最大公約數 int i,j; int sum,add; //sum為分子的積的和,add為分母積 scanf("%d",&n); type t[n]; //建立一個n大小的結構體陣列 for(i=0;i<n;i++) { scanf("%d/%d",&t[i].a,&t[i].b); } if(n==1) { if(t[0].a!=0) { c=gcd(t[0].a,t[0].b); t[0].a/=c; t[0].b/=c; if(t[0].a%t[0].b==0) //如果分母為1,則輸出分子就夠了 printf("%d\n",t[0].a/t[0].b); else printf("%d/%d\n",t[0].a,t[0].b); return 0; } else if(t[0].a==0) { //輸入的a為0的時候 printf("0\n"); return 0; } } else { //n大於1的時候 sum=t[0].a; add=t[0].b; for(i=1;i<n;i++) { sum=sum*t[i].b+t[i].a*add; // sum=a0*b1+a1*b0, add=b0*b1; add=add*t[i].b; c=gcd(sum,add); //c為最大公約數; sum/=c; //約分 add/=c; } add*=n; //分母乘以n,再跟分子約分; c=gcd(sum,add); sum/=c; add/=c; if(sum%add==0) { // 注意輸出的格式,分母為0的時候 printf("%d\n",sum/add); } else { printf("%d/%d\n",sum,add); return 0; } } } int gcd(int sum,int add) { int x,y,c; x=sum;y=add; while(sum!=0) { c=add%sum; add=sum; sum=c; } c=add; return c; }