基礎程式設計題(PTA) 7-35 有理數均值 (20分)

tsuiraku發表於2020-11-17

7-35 有理數均值 (20分)

  • 基礎程式設計題

題目:

本題要求編寫程式,計算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

思路

  • 最開始的想法是a[],b[]陣列存輸入的分子分母,dr存所有分母直接的乘積,nr存所有分子直接的通分.最後找最大公約數.但是當n很大的時候int可能會溢位
  • 改進,每次讀入a,b,算出它們的通分,並且約分


#include<iostream>
#include<stdio.h>
#include<set>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#include<string.h>
#include<stack>
#include<sstream>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
int n,a,b,nr=0,dr=1,temp;

int gcd(int x,int y)
{
    if(y) return gcd(y,x%y);
    else return x;
}

int main()
{   
    cin>>n;
    for(int i=0;i<n;i++)
    {
        scanf("%d/%d",&a,&b);
        nr*=b;
        nr+=a*dr;
        dr*=b;

        if(i==n-1) dr*=n;
        temp=gcd(nr,dr);
        nr/=temp;
        dr/=temp;
    }

    if(nr==0) printf("0");
    else if(dr==1) printf("%d",nr);
    else printf("%d/%d",nr,dr);
    return 0;
}     

相關文章