第三十四講|用迴圈累加
阿新 • • 發佈:2019-01-01
【專案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。
程式設計序,輸出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;
}