目前主要分為三個專欄,后續還會添加:
? ? ? ? 專欄如下:?? ? ? ? ? ? ? ??C語言刷題解析? ? ? ?C語言系列文章? ? ? ?我的成長經歷
感謝閱讀!
初來乍到,如有錯誤請指出,感謝!
描述
這次牛牛又換了個數列,他想計算:1+1/2+1/3+…+1/N的值。(保留6位小數)
輸入描述:
輸入一個整數,范圍在0到1000
輸出描述:
輸出一個浮點數
思路 :
理解題目要求:題目要求計算數列 ?1+1/2+1/3+…+1/N?的和,其中 N 是一個整數,范圍是 0?到 1000。結果需要保留六位小數。
輸入處理:讀取用戶輸入的整數 𝑁。
循環計算:使用一個循環從 11 到 𝑁(包括 𝑁),累加每一項 1 / i?。
精度控制:由于題目要求保留六位小數,我們需要在累加過程中就注意精度問題,避免因為浮點數的精度問題導致結果不準確。
輸出結果:將計算得到的和轉換為字符串格式,確保小數點后有六位數字,然后輸出。
- 在C語言中,
scanf
?用于讀取輸入,printf
?用于格式化輸出。 - 循環中的?
1.0 / i
?確保了除法操作的結果是一個浮點數,避免了整數除法的問題。 printf
?中的?%.6f
?格式化輸出確保了結果保留六位小數。
代碼 1 :
int main()
{int a = 0;double c = 0;scanf("%d", &a);for (int b = 1; b <= a; b++){c = 1.0 / b + c;}printf("%.6lf", c);return 0;
}
代碼 2:
#include <stdio.h> // 引入標準輸入輸出庫int main() // 主函數的開始
{double i = 1; // 定義一個變量i,表示分子,初始值為1double n = 0; // 定義一個變量n,用于存放用戶輸入的整數,初始值為0double j = 0; // 定義一個變量j,用于for循環的迭代,初始值為0double sum = 0; // 定義一個變量sum,用于累加求和,初始值為0scanf("%lf", &n); // 從標準輸入讀取一個浮點數,存儲在變量n中if (n == 1) // 如果輸入的n等于1{printf("1\n"); // 輸出1,因為1+1/2+...+1/1的和就是1}else if (n > 0 && n <= 1000) // 如果輸入的n大于0且小于等于1000{for (j = 1; j <= n; j++) // 使用for循環,從1迭代到n{sum = (i / j) + sum; // 計算每一項1/j,并加到sum上}printf("%.6lf\n", sum); // 輸出累加和sum,保留六位小數}else // 如果輸入的n不滿足條件(即n為負數或大于1000){printf("輸入錯誤\n"); // 輸出錯誤信息}return 0; // 返回0,表示程序正常結束
}//改進后的:
#include <stdio.h>int main()
{double n = 0; // 用戶輸入double sum = 0; // 用于累加的變量,初始化為0scanf("%lf", &n); // 讀取用戶輸入的整數if (n == 1) {printf("1\n"); // 如果輸入的n為1,直接輸出1} else if (n > 0 && n <= 1000) {for (double j = 1; j <= n; j++) { // 開始for循環,從1到nsum += 1.0 / j; // 直接使用1.0作為分子,累加到sum上}printf("%.6lf\n", sum); // 輸出累加和sum,保留六位小數} else {printf("輸入錯誤\n"); // 如果輸入的n不滿足條件,輸出錯誤信息}return 0; // 程序正常結束
}/*在這個修改后的版本中,我去掉了 double i = 1;
這行代碼,因為不需要單獨定義一個變量來表示分子。
在 for 循環中,直接使用 1.0 / j 來進行計算,
其中 1.0 表示分子,j 表示分母。
這樣代碼更為簡潔,并且避免了不必要的變量定義。*/
代碼 3 :
#include <stdio.h>int main() {int N;double sum = 0.0; // 用于累加的變量,初始化為0.0// 讀取輸入scanf("%d", &N);// 循環計算數列和for (int i = 1; i <= N; ++i) {sum += 1.0 / i; // 注意這里1.0是雙精度浮點數,以確保除法結果是浮點數}// 保留小數點后六位,使用printf的格式化輸出來實現printf("%.6f\n", sum);return 0;
}
知識點 :
浮點數精度:在C語言中,涉及到小數的計算時,需要使用浮點數類型,如 float
或 double
。由于題目要求保留六位小數,使用 double
類型可以提供足夠的精度。
輸入驗證:在讀取用戶輸入后,應進行驗證以確保輸入值在題目要求的范圍內(0到1000)。如果不在這個范圍內,應提示用戶輸入錯誤。
循環控制:使用 for
循環來遍歷從1到N(包括N)的整數,并計算每一項的和。
累加求和:在循環中,需要將每一項 1.0 / j
加到累加器 sum
上。注意這里使用 1.0
而不是 1
,因為 1.0
是一個 double
類型的值,這樣可以確保除法操作的結果是一個浮點數。
格式化輸出:使用 printf
函數的格式化輸出 %.6lf
來控制輸出的精度,保留小數點后六位。
條件語句:使用 if
或 else if
語句來處理不同的輸入情況,如輸入為1時的特殊情況,或者輸入不符合要求時的錯誤提示。
變量初始化:在開始計算之前,應確保所有變量(如累加器 sum
)已經被初始化,以避免使用未初始化的變量。
整數與浮點數的除法:在C語言中,當兩個操作數都是整數時,除法結果也是整數。因此,至少有一個操作數必須是浮點數,以進行浮點除法。
代碼風格:保持代碼的可讀性,使用適當的變量命名,添加注釋來解釋代碼的功能。
資源限制:注意題目中提到的時間限制和空間限制,確保算法的效率。
四舍五入:題目要求結果保留六位小數,這意味著需要進行四舍五入處理,C語言標準庫中 printf
函數可以直接完成這個任務。
??