PTA習題4-3 求分數序列前N項和 (易犯錯點講解以及注意事項)

 			習題4-3 求分數序列前N項和 (15分)

本題要求編寫程序,計算序列 2/1+3/2+5/3+8/5+… 的前N項之和。注意該序列從第2項起,每一項的分子是前一項分子與分母的和,分母是前一項的分子。

輸入格式:
輸入在一行中給出一個正整數N。

輸出格式:
在一行中輸出部分和的值,精確到小數點後兩位。題目保證計算結果不超過雙精度範圍。

輸入樣例:
20

輸出樣例:
32.66

今天來講解pta上的一到C語言程序設計編程題-求分數序列前N項和
其實說實話這套題思路沒什麼講解可言,但是我今天講解的是注意事項!
分享我的錯誤代碼

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a=2,b=1,t,i;
//    double a=2,b=1,t,i;//爲甚麼這裏要是double呢?
    double sum=2.0;
    if(n==1)
    {
        printf("%0.2lf",sum);
        return 0;
    }
    for(i=2;i<=n;i++)
    {
        t=a;
        a=a+b;
        b=t;
        sum+=1.0*a/b;
    }
    printf("%0.2lf",sum);
    return 0;
}

乍一看沒啥問題,我也是這麼覺得,哈哈哈!但是當我執行的時候發現結果如下:在這裏插入圖片描述

是的,n較大時會不符合結果,於是我就改變範圍

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    //int a=2,b=1,t,i;
    
    long a=2,b=1,t,i;//***事實證明這句還是會導致n較大時不通過***
    
    long long a=2,b=1,t,i;//*同時事實證明這句還是會導致n較大時不*通過
    
    double sum=2.0;
    if(n==1)
    {
        printf("%0.2lf",sum);
        return 0;
    }
    for(i=2;i<=n;i++)
    {
        t=a;
        a=a+b;
        b=t;
        sum+=1.0*a/b;
    }
    printf("%0.2lf",sum);
    return 0;
}

接下來我要講的纔是重點,我在百度的時候很多人都沒有給出爲原因?

大家知道a是斐波那契數列隨着n增大會變的非常大的!

我當時認爲改變該處的範圍就可以啦!但是就是不通過我就納悶啦!long不行也就罷啦,long long 可是8個字節呀!和double差不多吧!long long 應該必須通過的;

百思不得其解!後來我查書(C語言譚浩強第五版)
long 是4個字節 -2147483648~2147483647
long long 是8個字節 -9223372036854775808~9223372036854775807
即(-2^63 )------- (2^63)-1)
double 是8個字節 2.310^-308----- 1.710^38 (1.7乘以10的38次方)

我總以爲8個字節類型差不多,今天算是學到啦!double遠遠大於long long 的

所以int ,long 以及long long 都是不可以的,我也不知道誰出的題爲什麼要搞這麼大?我無語啦!也許可能出題人本身不知道會這麼大,認爲該題就是要用double的。怎麼會出現整型的呢?只不過我們喜歡一開始用的整型然後1.0*a/b吧!

我看見其他的博客,將double a=2,b=1;然後int t,a是要賦值給t的,最後發現int 不行然後換double t。最後解釋(int 爲什麼不行)說是類型轉換導致精度缺失。其實完全是沒深入瞭解。但是不得不承認它的第一步用double a,b,是對的。

其實總的來說

最後一個測試點沒有通過就是long long 太小啦!
double纔可以滿足n較大的情況!

所以a,b,臨時變量t都必須要用double

希望我這個解釋可以幫到你!

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    double a=2,b=1,t,i;
    double sum=2.0;
    if(n==1)
    {
        printf("%0.2lf",sum);
        return 0;
    }
    for(i=2;i<=n;i++)
    {
        t=a;
        a=a+b;
        b=t;
        sum+=1.0*a/b;
    }
    printf("%0.2lf",sum);
    return 0;
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章