前言: 本次教学是记录本人参加算法类比赛训练的心得,用的是vs2022版本,语言:c语言+c++STL库,适合算法类比赛c、c++组参考。
暴力(枚举)
暴力也是我们熟称的枚举,通熟易懂的理解:把题目给的所有的可能性都遍历一遍,找出符合条件的即可。缺点:时间复杂度较高,只用于解决一般的枚举出所有可能性的问题。
例子:水仙花数
链接:https://www.acwing.com/problem/content/3647/
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,它是这样定义的:“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1(3次方)+5(3次方)+3(3次方)。
现在要求输出所有在 m 和 n 范围内的水仙花数。
输入格式:
输入包含多组测试数据。
每组数据占一行,包含两个整数 m 和 n。
最后一行 0 0 表示输入结束。
输出格式:
每组数据输出一行答案,从小到大输出所有位于 [m,n]
范围内的水仙花数,数之间用空格隔开,如果没有则输出 no。
数据范围:
100≤m≤n≤999,
输入最多包含10组数据。
代码实现:
注意:
1.列出所有m到n的数,去判断是否符合水仙花数的条件。
2.想要输入多组数据可用while循环。
#include <stdio.h>
using namespace std;
bool Check(int x) {//检查是否是水仙花数
int remain = 0;//求和
int temp = x;
while (1) {
int reverse = temp % 10;//最后一位
temp = temp / 10;
remain += reverse * reverse* reverse;
if (temp == 0) {
break;
}
}
if (remain == x) {
return true;
}
else {
return false;
}
}
int main() {
int m, n;
while (scanf("%d%d", &m, &n) != EOF) {
if (n == 0 && m == 0) {
break;
}
bool isOK = false;
for (int i = m; i <= n; ++i) {
if (Check(i)) {
printf("%d ", i);
isOK = true;
}
}
if (isOK == false) {
printf("no\n");
}
else {
printf("\n");
}
}
return 0;
}