C++零基础入门——10循环进阶


一、枚举法(暴力搜索)

在循环中,我们经常会结合枚举法的思路去解题,这也是一个很基础的算法。

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是进入下一轮循环

专栏和博客不断更新中,欢迎关注哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小汪不秃头~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值