C++ 循环结构练习题目集
题目1:分离数位
题目描述
输入一个正整数,将其每一位数字按从低位到高位的顺序输出,数字之间用空格分隔。
输入样例
123
输出样例
3 2 1
数据范围
-
1 ≤ x ≤ 10^5
参考代码
#include <iostream> using namespace std; int main() { int x; cin >> x; while (x > 0) { cout << x % 10 << " "; x = x / 10; } return 0; }
解题思路
-
通过
x % 10
获取最低位数字。 -
通过
x = x / 10
去掉最低位,循环直到所有数位处理完毕。
知识点
-
循环结构、数位分离(取余和整除操作)。
题目2:含有k个3的数
题目描述
输入两个整数 m 和 k,判断 m 的十进制表示中是否恰好包含 k 个数字 3。
输入样例
333 3
输出样例
YES
数据范围
-
1 < m < 1e5
-
1 < k < 5
参考代码
#include <iostream> using namespace std; int main() { int m, k, cnt = 0; cin >> m >> k; int tmp = m; while (tmp > 0) { if (tmp % 10 == 3) cnt++; tmp /= 10; } cout << (cnt == k ? "YES" : "NO"); return 0; }
解题思路
-
遍历每一位数字,统计 3 出现的次数。
-
比较统计结果与 k 是否相等。
知识点
-
循环结构、条件判断。
题目3:数字出现次数统计
题目描述
输入两个整数 n 和 x,统计从 1 到 n 的所有整数中,数字 x 出现的总次数。
输入样例
11 1
输出样例
4
数据范围
-
1 ≤ n ≤ 1e5
-
0 ≤ x ≤ 9
参考代码
#include <iostream> using namespace std; int main() { int n, x, cnt = 0; cin >> n >> x; for (int i = 1; i <= n; i++) { int tmp = i; while (tmp > 0) { if (tmp % 10 == x) cnt++; tmp /= 10; } } cout << cnt; return 0; }
解题思路
-
外层循环遍历 1 到 n 的所有数字。
-
内层循环分离每个数字的位数,统计 x 的出现次数。
知识点
-
双重循环、数位分离。
题目4:回文数判断
题目描述
输入一个整数,判断它是否为回文数(正读和倒读相同)。
输入样例
121
输出样例
是回文数
数据范围
-
1 ≤ x ≤ 1e9
参考代码
#include <iostream> using namespace std; int main() { int x; cin >> x; int original = x, reversed = 0; while (x > 0) { reversed = reversed * 10 + x % 10; x /= 10; } cout << (original == reversed ? "是回文数" : "不是回文数"); return 0; }
解题思路
-
将原数字反转生成新数字。
-
比较原数字与反转后的数字是否相同。
知识点
-
数字反转、循环结构。
题目5:密码验证
题目描述
输入一个整数,若其逆序后的值等于 987,则输出“密码正确”,否则输出“密码错误”。
输入样例
789
输出样例
密码正确
数据范围
-
1 ≤ x ≤ 1e9
参考代码
#include <iostream> using namespace std; int main() { int x; cin >> x; int reversed = 0, tmp = x; while (tmp > 0) { reversed = reversed * 10 + tmp % 10; tmp /= 10; } cout << (reversed == 987 ? "密码正确" : "密码错误"); return 0; }
解题思路
-
反转输入的数字。
-
检查反转后的结果是否为 987。
知识点
-
数字反转、条件判断。
题目6:闰年判断
题目描述
输入一个年份 a,判断它是否为闰年。闰年规则:能被 4 整除但不能被 100 整除,或能被 400 整除。
输入样例
输出样例
复制
YES
数据范围
-
1 ≤ a ≤ 3000
参考代码
#include <iostream> using namespace std; int main() { int a; cin >> a; bool is_leap = (a % 4 == 0 && a % 100 != 0) || (a % 400 == 0); cout << (is_leap ? "YES" : "NO"); return 0; }
解题思路
-
直接根据闰年规则编写条件表达式。
知识点
-
条件运算符、逻辑表达式。
题目7:小鱼的游泳训练
题目描述
小鱼从周 x 开始,连续游泳 n 天。工作日(周一至周五)每天游 250 米,周末不游。计算总游泳距离。
输入样例
1 3
输出样例
750
数据范围
-
1 ≤ x ≤ 7
-
1 ≤ n ≤ 1e6
参考代码
#include <iostream> using namespace std; int main() { int x, n, distance = 0; cin >> x >> n; for (int i = 0; i < n; i++) { if (x != 6 && x != 7) distance += 250; x = (x == 7) ? 1 : x + 1; } cout << distance; return 0; }
解题思路
-
循环处理每一天,累加工作日的游泳距离。
-
使用模运算处理星期的循环。
知识点
-
循环结构、星期计算、条件判断。
题目8:水仙花数判断
题目描述
判断一个三位数是否为水仙花数(各位数字立方和等于原数)。输出所有三位水仙花数。
输入样例
无输入
输出样例
153 370 371 407
数据范围
固定处理三位数(100 ≤ n ≤ 999)
参考代码
#include <iostream> using namespace std; int main() { for(int n = 100; n < 1000; n++) { int a = n/100, b = n/10%10, c = n%10; if(n == a*a*a + b*b*b + c*c*c) cout << n << " "; } return 0; }
解题思路
-
遍历所有三位数
-
分离百位、十位、个位
-
验证立方和条件
知识点
-
数位分离、循环结构、幂运算
题目9:数列最大跨度
题目描述
输入一个正整数m和m个非负整数,输出数列最大值与最小值的差。
输入样例
5 8 3 6 2 5
输出样例
6
数据范围
-
1 ≤ m ≤ 1e5
-
0 ≤ 数值 ≤ 1000
参考代码
#include <iostream> using namespace std; int main() { int m, num, zmax = 0, zmin = 1000; cin >> m; for(int i=0; i<m; i++) { cin >> num; if(num > zmax) zmax = num; if(num < zmin) zmin = num; } cout << zmax - zmin; return 0; }
解题思路
-
初始化最大最小值
-
遍历输入时实时更新极值
知识点
-
极值算法、循环输入处理
题目10:偶数和计算
题目描述
输入正整数n,计算1到n之间所有偶数的和。
输入样例
6
输出样例
12
数据范围
-
1 ≤ n ≤ 1e6
参考代码
#include <iostream> using namespace std; int main() { int n, sum = 0; cin >> n; for(int i=2; i<=n; i+=2) sum += i; cout << sum; return 0; }
解题思路
-
步长2遍历偶数
-
累加求和
知识点
-
循环步长控制、等差数列求和
题目11:四叶玫瑰数
题目描述
找出所有四叶玫瑰数(四位数的各位四次方之和等于自身)。
输入样例
无输入
输出样例
1634 8208 9474
数据范围
固定处理四位数(1000 ≤ n ≤ 9999)
参考代码
#include <iostream> using namespace std; int main() { for(int i=1000; i<10000; i++) { int a = i/1000, b = i/100%10, c = i/10%10, d = i%10; if(i == a*a*a*a + b*b*b*b + c*c*c*c + d*d*d*d) cout << i << " "; } return 0; }
解题思路
-
遍历所有四位数
-
分离各位并验证四次方和
知识点
-
多位分离、幂运算优化
题目12:最长正常血压
题目描述
输入n个小时的血压记录,输出最长连续正常血压小时数(收缩压90-140且舒张压60-90)。
输入样例
复制
5 100 70 135 85 150 65 120 80 110 75
输出样例
3
数据范围
-
1 ≤ n ≤ 1e4
-
0 ≤ 血压值 ≤ 200
参考代码
#include <iostream> using namespace std; int main() { int n, a, b, t=0, m=0; cin >> n; for(int i=0; i<n; i++) { cin >> a >> b; if(a>=90 && a<=140 && b>=60 && b<=90) { t++; if(t > m) m = t; } else t = 0; } cout << m; return 0; }
解题思路
-
实时维护当前连续正常时长
-
遇到异常重置计时器
知识点
-
状态维持、极值更新
题目13:质数分解
题目描述
输入偶数n(n>2),找到两个质数使其和等于n且乘积最大。
输入样例
20
输出样例
91
数据范围
-
4 ≤ n ≤ 1e4
参考代码
#include <iostream> #include <cmath> using namespace std; bool isPrime(int x) { for(int i=2; i<=sqrt(x); i++) if(x%i == 0) return false; return true; } int main() { int n; cin >> n; for(int i=n/2; ; i++) { if(isPrime(i) && isPrime(n-i)) { cout << i*(n-i); break; } } return 0; }
解题思路
-
从n/2开始寻找最近的质数对
-
利用数学性质:差最小的质数对乘积最大
知识点
-
质数判断、数学优化
题目14:特殊队列问题
题目描述
队伍排队时,每次2/3/4/5/6人一组都会余1人,7人一组正好。求最少可能人数。
输入样例
无输入
输出样例
复制
301
数据范围
答案唯一解
参考代码
#include <iostream> using namespace std; int main() { int times = 0; while(true) { times += 7; if(times%2==1 && times%3==1 && times%4==1 && times%5==1 && times%6==1) { cout << times; break; } } return 0; }
解题思路
-
步长7递增(保证7人一组整除)
-
验证其他分组余数条件
知识点
-
同余定理、步长优化
题目15:统计特殊余数的个数
题目描述
统计1到100之间(包含1和100)所有整数i满足i % 8 == 1
的次数。
输入输出样例
输入样例:无输入
输出样例:
13
参考代码1
int main() { int i = 100, x = 0, y = 0; while (i > 0) { i--; x = i % 8; if (x == 1) y++; } cout << y << endl; return 0; }
解题思路
-
逆序遍历:从100开始逆序遍历到1,检查每个数对8取余是否为1。
-
计数器累加:满足条件时计数器
y
加1。
知识点
循环结构、模运算、条件判断。
题目16:区间质数统计
题目描述
输入两个整数m和n(2 ≤ m ≤ n ≤ 1000),输出区间[m, n]内的质数个数。
输入输出样例
输入样例:
2 10
输出样例:
4
参考代码
int main() { int m, n, sum = 0; cin >> m >> n; for (int i = m; i <= n; i++) { bool is_prime = true; for (int j = 2; j < i; j++) { if (i % j == 0) { is_prime = false; break; } } if (is_prime) sum++; } cout << sum << endl; return 0; }
解题思路
-
遍历区间:对区间内每个数进行质数判断。
-
质数判定:若存在除1和自身外的因数,则不是质数。
知识点
双重循环、质数判断逻辑、布尔标志位。
题目17:分解质因数
题目描述
输入一个正整数num(2 ≤ num ≤ 10000),将其分解为质因数相乘的形式输出。
输入输出样例
输入样例1:
6
输出样例1:
6=2*3
输入样例2:
60
输出样例2:
60=2*2*3*5
参考代码
int main() { int num; cin >> num; cout << num << "="; for (int i = 2; i <= num; i++) { while (num % i == 0) { cout << i; num /= i; if (num != 1) cout << "*"; } } return 0; }
解题思路
-
从小到大试除:从2开始依次尝试整除输入的数。
-
循环分解:若当前数i是因数,则持续分解直至无法整除。
知识点
质因数分解、循环嵌套、字符串拼接。
题目18:寻找回文质数
题目描述
输入一个正整数n(n ≥ 11),输出所有小于等于n且同时是回文数和质数的数。
输入输出样例
输入样例1:
20
输出样例1:
11是回文数
输入样例2:
1000
输出样例2:
11是回文数 101是回文数 131是回文数 151是回文数 ...
参考代码4
int main() { int n; cin >> n; for (int i = 11; i <= n; i++) { int reversed = 0, original = i; while (original != 0) { reversed = reversed * 10 + original % 10; original /= 10; } if (reversed == i) { bool is_prime = true; for (int j = 2; j < i; j++) { if (i % j == 0) { is_prime = false; break; } } if (is_prime) cout << i << "是回文数 "; } } return 0; }
解题思路
-
回文数判断:反转数字与原数比较。
-
质数校验:对回文数进行质数判定。
知识点
数字反转、复合条件判断、算法效率优化。
题目19:可逆质数
题目描述
输出1000以内所有可逆质数(即质数反转后仍为质数),每行最多10个数。
输入输出样例
输入样例:无输入
输出样例(部分):
2 3 5 7 11 13 17 ...
参考代码
int main() { int c = 0; for (int m = 2; m <= 1000; m++) { bool prime1 = true; for (int i = 2; i <= sqrt(m); i++) { if (m % i == 0) { prime1 = false; break; } } if (prime1) { int reversed = 0, temp = m; while (temp > 0) { reversed = reversed * 10 + temp % 10; temp /= 10; } bool prime2 = true; for (int i = 2; i <= sqrt(reversed); i++) { if (reversed % i == 0) { prime2 = false; break; } } if (prime2) { cout << m << "\t"; c++; if (c % 10 == 0) cout << endl; } } } return 0; }
解题思路
-
质数筛选:遍历2到1000,筛选质数。
-
反转验证:反转质数后再次进行质数判断。
知识点
质数筛法、数字反转、格式化输出。
题目20:最大公约数(枚举法)
题目描述
输入两个正整数a和b,输出它们的最大公约数。
输入输出样例
输入样例1:
12 18
输出样例1:
6
输入样例2:
7 5
输出样例2:
1
参考代码
int main() { int a, b; cin >> a >> b; for (int i = min(a, b); i >= 1; i--) { if (a % i == 0 && b % i == 0) { cout << i << endl; return 0; } } return 0; }
解题思路
从两数较小值开始递减遍历,找到第一个能同时整除两数的数。
知识点
枚举法、循环控制、数学基础。
题目21:最大公约数(辗转相除法)
题目描述
输入两个正整数m和n,用辗转相除法求它们的最大公约数。
输入输出样例
输入样例1:
24 36
输出样例1:
12
输入样例2:
17 13
输出样例2:
1
参考代码
int main() { int m, n, r; cin >> m >> n; r = m % n; while (r != 0) { m = n; n = r; r = m % n; } cout << n << endl; return 0; }
解题思路
-
反复取余:用较大数除以较小数,余数替换较大数。
-
终止条件:余数为0时,当前除数即为最大公约数。
知识点
欧几里得算法、循环与条件判断。
题目22:铺地板的最优方案
题目描述
已知房间长75厘米,宽60厘米。需用正方形瓷砖铺满地面,且必须用整块瓷砖。求瓷砖边长的所有可能值,并输出最大边长时需要的瓷砖数。
输入输出样例
输入样例:无输入
输出样例:
1 3 5 15 15
参考代码
int main() { int x = 75, y = 60, a; for (int i = 1; i <= min(x, y); i++) { if (x % i == 0 && y % i == 0) { cout << i << " "; a = i; } } cout << endl << (75 * 60) / (a * a); return 0; }
解题思路
-
求公约数:瓷砖边长必须是长和宽的公约数。
-
计算面积:最大公约数对应瓷砖面积最小,数量最少。
知识点
公约数应用、实际问题建模。
题目23:约分三角函数
题目描述
输入三角形的三边长a、b、c(构成直角三角形),输出最短边与最长边的比值的最简分数形式。
输入输出样例
输入样例1:
3 4 5
输出样例1:
3/5
输入样例2:
6 8 10
输出样例2:
3/5
参考代码
int main() { int a, b, c, max, min, r; cin >> a >> b >> c; max = a > b ? a : b; max = c > max ? c : max; min = a < b ? a : b; min = c < min ? c : min; a = min; c = max; r = c % a; while (r != 0) { c = a; a = r; r = c % a; } cout << min / a << "/" << max / a; return 0; }
解题思路
-
找最值:确定最短边和最长边。
-
约分:用辗转相除法求最大公约数进行约分。
知识点
最值判断、分数约分、数学逻辑。