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

第三十四講|用迴圈累加

【專案1:分數的累加】
程式設計序,輸出1/3-3/5+5/7-7/9…+19/21的結果
提示:如果直接解決上面的問題有困難,可以設計一條“由易到難”的路線,逐漸解決其中要解決的問題,讓自己的思路明朗起來。
(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  ——這是我們的目標。品品這種思路,一口吃不成胖子,學會一口一口吃飯。用心程式設計,再大的障礙,也會一個一個地排除。

#include "stdio.h"
int main()
{
	double sum=0,i,s=1;
	for(i=1.0;i<20;i+=2)
	{
		sum=sum+i/(i+2);
		sum=sum*s;
		s=-s;
	}
	printf("%f",sum);
}
執行結果



心得 注意定義變數應為double型。因為求和 為小數,所以i=1.0,又因為i是小數分子上的,應該迴圈19次。

【專案2:麻煩的累加漲功夫】
計算(1)


#include "stdio.h"
int main()
{
	double s=0,i,t=0.5,x,y=1.0;//s為和,i為迴圈次數,x是中間變數,t為底數,y為調整符號。
	for(i=0;i<=8;i++)
	{
		t*=2;
		x=1.0/t;
		x*=y;
		s+=x;	
		y=-y;
		
	}
	printf("%f",s);
	return 0;
}
//變數,步驟偏多。可以優化。各語句之間的順序錯了好幾回。
執行結果



心得 變數,步驟偏多。可以優化。各語句之間的順序錯了好幾回。故附上老師的程式碼,如下。

#include <stdio.h>  
int main( )  
{  
    int i,m=1;  //m表示2的冪,1為2的0次冪,與迴圈相符  
    double sum=0, s=1.0; //s直接取double型,保證除的結果是浮點型  
    for(i=0; i<=8; ++i)  
    {  
        sum=sum+s/m;  
        m*=2;   //2的i次冪由此計算得到  
        s=-s;  
    }  
    printf("%f\n", sum);  
    return 0;  
}

(2)

#include "stdio.h"
int main()
{
	int i,t=1;//i為迴圈,t為階乘
	double f=0,s=1.0;
	for(i=1;i<10;++i)
	{
		t*=i;
		f=f+s/t;
		//f*=s;//直接把s提到分子上,不要再乘f,否則f的值會正負變化。
		s=-s;

	}
	printf("%f\n",f);
}


執行結果


心得 那個f*=s那一步是錯誤的,可以直接把s提到分子上,不要再乘f,否則f的值會正負變化。再附上老師的程式碼。

#include <stdio.h>  
int main( )  
{  
    int i,f=1;  //f表示加數分母上的階乘,初值1為1的階乘  
    double sum=0, s=1.0; //s直接取double型,保證除的結果是浮點型  
    for(i=1; i<=9; ++i)  
    {  
        f*=i;   //計算得到i的階乘  
        sum=sum+s/f;//1樓指出的錯誤表示式是sum=sum+s*i/f;  
        s=-s;  
    }  
    printf("%f\n", sum);  
    return 0;  
}