C++算法競賽篇(五)循環嵌套題型講解
- 前言
- C++循環嵌套題型講解
- 第一題 包含數字的9
- 第二題 求出 e 的值
- 第三題 斐波那契數列
- 第四題 第 n 小的質數
- 第五題 水仙花數
前言
- 前面的題型里我們認識了C++里面的三大循環
- 本篇博客我們開始講解C++循環嵌套題型
我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++算法競賽篇文章專欄
歡迎來閱讀指出不足
https://blog.csdn.net/2402_83322742/category_13001405.html?spm=1001.2014.3001.5482
C++循環嵌套題型講解
第一題 包含數字的9
題目鏈接https://www.nowcoder.com/practice/0948f4f3344c452f843afd3585dd0f8d?tpId=290&tqId=320953&ru=/exam/oj&qru=/ta/beginner-programmers/question-ranking&sourceUrl=%2Fexam%2Foj
解題思路:
- 遍歷范圍:需統計
1~2019
所有整數中包含數字9
的數的個數,通過for
循環遍歷i
從1
到2019
。 - 包含9的判斷邏輯:對每個數
i
,用while
循環分解其每一位(n = i
,通過n % 10
取末位、n = n / 10
去掉末位)。若某一位為9
,則計數count++
并通過break
跳出該數的判斷(避免重復計數)。 - 輸出格式:遍歷結束后,輸出最終計數
count
。
#include <iostream>
using namespace std;int main() {int count = 0;for (int i = 1;i<=2019;i++){int n = i;while(n){if( n % 10 == 9){count++;break;}n = n /10;}}cout << count ;return 0;
}
第二題 求出 e 的值
題目鏈接https://www.luogu.com.cn/problem/B2079
解題思路:
- 輸入處理:用
cin
讀取整數n
,確定需計算e
的近似值的累加項數(共n+1
項,包含0!
)。 - 累加邏輯(嵌套循環):
- 外層
for
循環控制累加次數(從1
到n
,對應1/1!
到1/n!
)。 - 內層
for
循環計算當前項的階乘(r = r * j
,j
從1
到i
),再將1.0 / r
累加到sum
(注意用1.0
確保浮點運算)。
- 外層
- 輸出格式:用
printf
按%.10f
格式輸出保留 10 位小數的e
近似值。
#include <iostream>
#include <cstdio>using namespace std;int main()
{int n;double sum = 1;cin >> n;for(int i = 1; i <= n; i++){long long r = 1;for(int j = 1; j <= i; j++){r *= j;}sum += 1.0 / r;}printf("%.10f\n", sum);return 0;
}
第三題 斐波那契數列
題目鏈接 https://www.luogu.com.cn/problem/B2064
解題思路:
- 輸入處理:先讀取測試用例數
n
,再通過while(n--)
循環逐個讀取需查詢的斐波那契數列位置a
。 - 斐波那契計算邏輯:
- 斐波那契數列前兩項固定為
1, 1
(x=1, y=1
)。 - 若
a > 2
,用while
循環迭代計算:z = x + y
(下一項),更新x = y
、y = z
,直到迭代到第a
項。
- 斐波那契數列前兩項固定為
- 輸出格式:對每個查詢的
a
,輸出對應的斐波那契數z
。
#include <iostream>
using namespace std;int main()
{int n = 0;int a = 0;cin >> n;while(n--){cin >> a;// 計算第a個斐波那契數int x = 1;int y = 1;int z = 1;while (a > 2){z = x + y;x = y;y = z;a--;}cout << z << endl;}return 0;
}
第四題 第 n 小的質數
題目鏈接 https://www.luogu.com.cn/problem/B2085
解題思路:
- 輸入處理:用
cin
讀取整數n
,表示需找第 n 個質數。 - 質數判斷邏輯(循環嵌套):
- 外層
while(1)
循環遍歷數字i
(從2
開始,因為2
是最小質數)。 - 內層
for
循環通過j <= sqrt(i)
優化判斷:若i % j == 0
,則i
不是質數(flag=0
);否則i
是質數(flag=1
)。 - 找到質數時
cnt++
,當cnt == n
時,跳出循環,此時i
即為第n
小的質數。
- 外層
- 輸出格式:輸出第
n
小的質數i
。
#include <iostream>
#include <cmath>
using namespace std;int main()
{int n;cin >> n;int i = 2;int cnt = 0; // 計數器while(1){// 判斷i是否是素數int flag = 1; // 假設是素數for(int j = 2; j <= sqrt(i); j++){if(i % j == 0){flag = 0; // 不是素數break;}}if(flag == 1)cnt++;if(cnt == n)break;i++;}cout << i << endl;return 0;
}
第五題 水仙花數
題目鏈接 https://ybt.ssoier.cn/problem_show.php?pid=2029
解題思路:
- 遍歷范圍:需篩選
100~999
的所有三位數,通過for
循環遍歷i
從100
到999
。 - 水仙花數判斷邏輯:
- 對每個數
i
,用while
循環分解其每一位(tmp = i
,通過tmp % 10
取末位、tmp = tmp / 10
去掉末位)。 - 計算各位數字的立方和(
r += pow(tmp % 10, 3)
),判斷r
是否等于原數i
。
- 對每個數
- 輸出格式:逐個輸出符合條件的水仙花數
i
。
#include <iostream>
#include <cmath>
using namespace std;int main()
{for(int i = 100; i <= 999; i++){int tmp = i;int r = 0;while(tmp){r += pow(tmp % 10, 3);tmp /= 10;}if(r == i)cout << i << endl;}return 0;
}
以上就是這篇博客的全部內容,下一篇我們將繼續探索C++算法的更多精彩內容。
我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++算法競賽篇文章專欄
歡迎來閱讀指出不足
https://blog.csdn.net/2402_83322742/category_13001405.html?spm=1001.2014.3001.5482
非常感謝您的閱讀,喜歡的話記得三連哦 |