PTA訓練--N個分數之和

Hello你們好,今天作了一道PTA的題,題目比較簡單,可是有些細節仍是須要注意的,就好比我,調試了很長時間才經過測試,可能使我太菜吧!(🤪),如今將個人代碼和解題過程發出來,僅供初學者參考!函數

題目:

1.PNG

解題思路:
這道題並不難,就是按照數學的解題思路,將之用程序代碼描述出來。
要解決這道題,你先須要知道最大公約數和最小公倍數的求法,懂得了這個,這個題基本上就算結束了。。。。。
接下來請看::

long long gcd(long long a,long long b)//最大公約數
{
return (a%b!=0?(gcd(b,a%b)):b);
}
long long lcm(long long a,long long b)//最小公倍數
{
long long t=gcd(a,b);
return (a*b/t);
}
這是求最大公約數和最小公倍數的基本方法,至關於一個模板,只須要記住便可,這個不會的能夠自行度娘。

而後咱們須要知道,想求兩個分數的和,確定第一步是進行通分,而後相加化簡,上邊沒有用的事Long Long型,由於要考慮溢出。
將他們加起來化簡以後,按格式輸出便可,須要注意的是:正負由分子決定,分子正則正、負則負。

接下來請看完整代碼:測試

#include<stdio.h>
    //typedef,將Long Long起別名LL,方便後邊寫和閱讀。
    //gcd函數爲求兩個數的最大公約數
    typedef long long LL;
    LL gcd(LL a,LL b){
    if(a % b == 0) return b;
    return gcd(b,a % b);
    }
    //主函數
    int main()
    {
    int N;//輸入分數的個數
    scanf("%d",&N);
    LL na,nb,a,b,q;
    scanf("%lld/%lld",&na,&nb);
    //循壞前一個與後一個分數相加
    while(--N){
        scanf("%lld/%lld",&a,&b);
        //這部分爲兩個分數相加的過程,看不懂的能夠在草稿紙上算一下哦!
        q = gcd(nb,b);
        nb = nb / q * b;
        na =na* b / q;
        na += nb / b * a;
        //化簡分數
        if(na > 0) q = gcd(na,nb);
        else q = gcd(-na,nb);
        na /= q,nb /= q;
    }
    //按規定格式輸出
    LL cut = na;
    if(na< 0) cut = -na;
    if(cut % nb == 0)
            printf("%lld\n",na / nb);
    else{
        cut = cut % nb;
        if(na < 0) cut = -cut;
        LL p = na / nb;
        q = gcd(cut,nb);
        cut /= q,nb /= q;
        if(p != 0 && cut != 0) 
            printf("%lld%lld/%lld\n",p,cut,nb);
        if(p == 0 && cut != 0) 
            printf("%lld/%lld\n",cut,nb);
    }
    return 0;
    }

好啦,這就是今天的這道題了,但願對大家有用哦!🤝spa

相關文章
相關標籤/搜索