文章目录
一、枚举法(暴力搜索)
在循环中,我们经常会结合枚举法的思路去解题,这也是一个很基础的算法。
1. 概念
枚举法就是列举出问题所有可能性答案,然后从中一个一个的筛选出符合要求的内容。
(也叫它暴力搜索,在所有可能性中暴力的去搜索正确答案)
2. 优缺点
枚举法依靠遍历,思路简单,易于理解;但是,枚举法通常运算量比较大,解题效率不高。
3. 示例
求解水仙花数:
求出100~999范围内所有的水仙花数。
水仙花数,即为各位数的立方和等于其本身。以153为例:1 * 1 * 1 + 5 * 5 * 5+ 3 * 3 * 3 = 153
示例输出:
153
370
371
407
解析: 这道题就是一道经典的枚举法求解问题。通过题目分析,可以很明显的知道要想找到100-999之间的所有水仙花数,那么我们答案的可能性就在这100-99之间,故:我们需要做的第一步,就是利用for循环将100-999的数字循环列举出来;第二步,再根据水仙花数的条件进行答案判断。
#include<iostream>
using namespace std;
int main(){
for(int i=100;i<=999;i++){ // 列举所有可能:数字100-999
int a=i%10; // 获取个位数
int b=i/10%10; // 获取十位数
int c=i/100%10; // 获取百位数
if(a*a*a+b*b*b+c*c*c==i){ // 判断是否满足水仙花数条件,满足则输出答案
cout << i;
}
}
}
练习一 鸡兔同笼
题目介绍:
鸡兔同笼是中国古代的数学名题之一:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?
有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?
输出样例: 23 12
我是一条答案分割线
#include<iostream>
using namespace std;
int main(){
//设鸡有i只,兔有(35-i)只
for(int i=0;i<=35;i++){ //极端假设法:笼中全是兔,鸡i=0;笼中全是鸡,鸡i=35,即鸡的可能性为0-35
if(i*2+(35-i)*4==94){ // 判断鸡*2(两只脚)+兔*4(4只脚)=94则符合答案
cout << i << " " << 35-i;
}
}
}
练习二 余数相同
题目介绍:
已知三个正整数 a,b,c(从大到小排列)。现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。
输出所有满足上述条件的x值。
输入样例:
300 262 205
输出样例:
19
我是一条答案分割线
#include<iostream>
using namespace std;
int main(){
int x,a,b,c;
cin >> a >> b >> c;
// 题目指出x是大于1的整数,故x的最小可能性为2,最大可能性为c(a,b,c从大到小排列)
for(int x=2;x<=c;x++){
if((a%x==b%x)&&(b%x==c%x)){
cout << x << endl;
}
}
}
二、break
1. 作用
退出当前循环
2. 示例:
#include<iostream>
using namespace std;
int main(){
int i=1;
while(true){
if i==5:
break // 当i=5时,退出循环,循环程序停止
cout << i << endl;
i++;
}
}
// 输出结果:
// 1
// 2
// 3
// 4
练习三 寻找5的倍数和
题目介绍: 求数字1-100范围内5的倍数,并将其依次相加求和,找出第一次相加和大于50的数字。
输出样例:
5
10
15
20
我是一条答案分割线
#include<iostream>
using namespace std;
int main(){
int sum=0;
for(int i=1;i<=100;i++){ // 遍历1-100的数字
if(i%5==0){ // 如果i除以5的余数等于0,则说明i是5的倍数
sum+=i; // 记录和
cout << i << endl; // 输出数字
}
if(sum>=50){ // 数字和大于等于50时,退出循环
break;
}
}
}
三、continue
1.作用
退出一次循环,continue会忽略循环体中剩下的语句,直接进入下一轮循环。
示例:
#include<iostream>
using namespace std;
int main(){
int i=1;
while(true){
if i==5:
continue // 当i=5时,退出一次循环,直接开启下一轮循环
cout << i << endl;
i++;
}
}
// 输出结果:
// 1
// 2
// 3
// 4
// 6
// 7
// ......
练习四 幸运游戏7
题目介绍:
游戏规则:从某个数开始顺序数数,数到7的倍数时须跳过。
输入一个起始数字n,求数字n到100之间所有符合游戏规则的数字。
输入样例: 90
输出样例:
90
92
93
94
95
96
97
99
100
我是一条答案分割线
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
for(int i=n;i<=100;i++){ // 遍历n-100的数字
if(i%7==0){ // 如果是7的倍数,就跳过
continue;
}
cout << i << endl;
}
}
四、break与continue的区别
break是直接结束了循环,而continue是进入下一轮循环
专栏和博客不断更新中,欢迎关注哦~