第三十四講 專案 用迴圈累加
任務和程式碼:
【專案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;
}
輸出結果:
總結: 注意強制型別轉換