1. 程式人生 > >第三十四講 專案 用迴圈累加

第三十四講 專案 用迴圈累加

任務和程式碼:

【專案1:分數的累加】
程式設計序,輸出1/3-3/5+5/7-7/9…+19/21的結果

/*
*Copyright (c) 2016, CSDN學院
*All rights reserved.
*文件名:main.c
*作者:DylanLiu
*完成日期:2016/09/10
*版本號:V1.0
*
*問題描述:輸出1/3-3/5+5/7-7/9…+19/21的結果。
*程序輸出:1/3-3/5+5/7-7/9…+19/21的結果。
*/

#include <stdio.h>

int main()
{
    int s=1, n=10, i=0;
    float sum=0.0;
    for (i=1
; i<=n; i++){ sum+=s*(float)(2*i-1)/(2*i+1); s=-s; } printf("%.2f\n", sum); return 0; }

輸出結果:

========================================================================================
注:
提示:如果直接解決上面的問題有困難,可以設計一條“由易到難”的路線,逐漸解決其中要解決的問題,讓自己的思路明朗起來。
(1)1+2+…+20 ——這個應該會
(2)1+1/2+1/3+…+1/20 ——分數的累加,注意兩個整型相除,商也為整型,而顯然求和結果應該是小數
(3)1/2+2/3+3/4+…+19/20 ——分子不全是1了,找找規律,稍加改動就好了
(4)1/2-2/3+3/4-…+19/20 ——要累加的值一正一負倒騰,用pow(-1,i)是個效率很低的做法,不推薦使用。技巧:專門設定一個變數s表示累加項的符號,取值隨著迴圈,每次乘以-1,從而在+1、-1之間變化,迴圈加求和的累加要用累加的項(i/(i+1))乘以這個表示符號的s。
(5)1/3-3/5+5/7-7/9…+19/21 ——這是我們的目標。品品這種思路,一口吃不成胖子,學會一口一口吃飯。用心程式設計,再大的障礙,也會一個一個地排除。
1+2+…+20 :

#include <stdio.h>  
int main( )  
{  
    int sum=0,i;  
    for(i=1; i<=20; ++i)  
        sum+=i;  
    printf("%f\n", sum);  
    return 0;  
}  

1+1/2+1/3+…+1/20 ——分數的累加,注意兩個整型相除,商也為整型,而顯然求和結果應該是小數

#include <stdio.h>  
int main( )  
{  
    int i;  
    double sum=0;  //注意結果將為小數  
    for
(i=1; i<=20; ++i) sum=sum+1.0/i; //注意是1.0/i,而不能是1/i printf("%f\n", sum); return 0; }

1/2+2/3+3/4+…+19/20 ——分子不全是1了,該找找規律了,也不是從1開始加了

#include <stdio.h>  
int main( )  
{  
    int i;  
    double sum=0;  
    for(i=2; i<=20; ++i)  
        sum=sum+(double)(i-1)/i; //注意是(double)(i-1)/i;,而不能是(i-1)/i  
    printf("%f\n", sum);  
    return 0;  
}  

1/2-2/3+3/4-…+19/20 ——要累加的值一正一負倒騰,用pow(-1,i)是個效率很低的做法,不推薦使用。技巧:專門設定一個變數s表示累加項的符號,取值隨著迴圈,每次乘以-1,從而在+1、-1之間變化,迴圈加求和的累加要用累加的項(i/(i+1))乘以這個表示符號的s

#include <stdio.h>  
int main( )  
{  
    int i,s=1;  
    double sum=0;  
    for(i=2; i<=20; ++i)  
    {  
        sum=sum+s*(double)(i-1)/i; //用s乘以被加的分數,考慮了待加項的符號  
        s=-s;    //-是一目的負號運算子,獲得s的相反數,以此將迴圈中在+1和-1間交替  
    }  
    printf("%f\n", sum);  
    return 0;  
}  

思考:如果for迴圈這樣寫,程式該如何改?

#include <stdio.h>  
int main( )  
{  
    int i,s=1;  
    double sum=0;  
    for(i=1; i<=19; i+=2)  
    {  
        sum=sum+s*____________________; //使相鄰的兩個奇數將相除  
        s=-s;  
    }  
    printf("%f\n", sum);  
    return 0;  
}  

補全後的程式碼:

#include <stdio.h>
int main( )
{
    int i,s=1;
    double sum=0;
    for(i=1; i<=19; i+=2)
    {
        sum=sum+s*(float)i/(i+2); //使相鄰的兩個奇數將相除
        s=-s;
    }
    printf("%f\n", sum);
    return 0;
}

輸出結果:

任務和程式碼:

【專案2:麻煩的累加漲功夫】

計算:(1)
關注效率,要求用單重迴圈完成,第一個式子的計算不能用求冪函式pow()
的解:

/*
*Copyright (c) 2016, CSDN學院
*All rights reserved.
*檔名:main.c
*作者:DylanLiu
*完成日期:2016/10/04
*版本號:V1.0
*
*問題描述:。
*程式輸出:。
*/

#include <stdio.h>

int main()
{
    int s=1, i=0, n=8, m=1;
    float sum=0.0;
    for (i=0; i<=n; i++){
        sum+=s*(float)1/(m);
        m=m*2;
        s=-s;
    }
    printf("%.2f\n", sum);

    return 0;
}

輸出結果:

的解:

/*
*Copyright (c) 2016, CSDN學院
*All rights reserved.
*檔名:main.c
*作者:DylanLiu
*完成日期:2016/10/04
*版本號:V1.0
*
*問題描述:。
*程式輸出:。
*/

#include <stdio.h>

int main()
{
    int i=0, n=9, m=1;
    float sum=0.0, s=1.0;
    for(i=1; i<=n; i++){
        m*=i;
        sum+=s/m;
        s=-s;
    }
    printf("%.2f\n", sum);

    return 0;
}

輸出結果:

總結: 注意強制型別轉換