关于小青蛙爬井的故事,你应该早就听过了:井深10
尺,小青蛙从井底向上爬,每个白天向上爬3
尺,每个晚上又滑下来2
尺,然后问你第几天它能爬上来。答案是第8
天。
现在,那只著名的小青蛙又回来了,它现在每个白天已经可以向上爬 a
尺了,当然,晚上还是要下滑b
尺的。如果告诉你井深h
尺,请计算一下,现在,它第几天可以爬上来?
这是一道很典型的while
循环题目。什么是while
循环呢?今天我们就来认识一下
while循环
while循环的构成
在C++
中,while
循环是一种基本的控制流结构,它允许程序在满足特定条件时重复执行一段代码。while
循环的构成相对简单,主要包括循环条件和循环体:
while(条件判断){
// 循环体
// 这里放置要重复执行的代码
}
while循环的特性
while 循环是编程中常用的控制流语句之一,用于在满足特定条件时重复执行一段代码。以下是 while 循环的一些主要特性:
条件判断
while
循环在每次迭代开始时都会检查一个条件表达式- 如果条件表达式为真(即非零或非空值),则执行循环体内的代码块
- 如果条件表达式为假(即零或空值),则退出循环
重复执行
- 只要条件为真,循环体内的代码块就会不断重复执行
- 没有固定的迭代次数,循环次数完全取决于条件何时变为假
先检查条件
while
循环属于前测试循环
,意味着在每次迭代之前都会检查条件- 这与
do-while
循环不同,后者在每次迭代之后检查条件,因此至少会执行一次循环体
无限循环的风险
- 如果条件表达式始终为真,
while
循环将无限执行下去,可能导致程序挂起或崩溃 - 需要特别注意确保存在一个明确的退出条件,以避免无限循环
代码块
- 循环体内的代码块可以包含任意数量的语句,甚至可以是嵌套循环
- 代码块通常被大括号
{ }
包围,以明确循环的范围
更新循环变量
- 在循环体内,通常会更新一个或多个循环变量,以便最终使条件表达式变为假,从而退出循环
- 如果忘记更新循环变量,可能会导致无限循环(死循环)
灵活性
while
循环非常灵活,可以用于各种情况,如用户输入、数据处理、文件读取等
关键点
- 条件
条件是一个bool
表达式(即返回true
或false
的表达式)。在每次循环迭代之前,都会评估这个条件。如果条件为真(true
),则执行循环体中的代码。如果条件为假(false
),则跳过循环体,继续执行while
循环之后的代码 - 循环体
循环体是用大括号{ }
括起来的代码块。只要条件为真,这段代码就会重复执行 - 循环变量
通常,while
循环中会包含一个或多个循环变量,这些变量在循环体中发生变化,以影响循环条件的评估。这是确保循环最终能够终止的关键
示例
以下是一个简单的C++
的while
循环示例,用于打印数字1到50:
#include<bits/stdc++.h>
#define int long long // 宏命令,可省略
using namespace std;
signed main(){ // 因为将int定义为“long long”,mian函数返回值类型要改变
int n = 1;
while(n <= 50){
cout << n <<" ";
n = n + 1;
}
}
在这个示例中,n
是循环变量,它初始化为1
。while
循环的条件是n <= 50
。在每次循环迭代中,都会打印当前的n
值,并将n
增加1
。当n
t达到50
时,条件变为假,循环终止
注意事项
- 确保循环条件最终会变为假,以避免无限循环
- 在循环体内适当地更新循环变量
- 可以使用
break
语句来提前终止循环,或者使用continue
语句来跳过当前循环迭代并继续下一次迭代
总之,while
循环是一种强大的控制流语句,但使用时需要小心,确保循环能够正常终止,避免无限循环
解题与分析
分析题目
每个白天可以向上爬 a
尺,晚上要下滑b
尺。告诉你井深h
尺,要用几天?
看完题,可以得出:
① 白天没爬出去,距离井口的距离只减少a - b
尺
② 每个白天都相当于一天(当天爬出去了也算)
③ 不能用h / (a - b) + 1
来做这题(不信自己算)
整理思路
根据分析,我们有两种解题方法:
- 利用数学建模找出的公式直接解决,但难度太大,不确定因素太多,我并不推荐,感兴趣的朋友可以自己探索
- 利用while循环一天一天的爬(正好学习while循环)
第一种难度太大,以我才一点点大的小小年龄还做不到,还是先带大家学习while循环吧
编程实现
首先,放上祖传编程头文件和main函数:
#include<bits/stdc++.h>
#define int long long // 宏命令,可省略
using namespace std;
signed main(){ // 因为将int定义为“long long”,mian函数返回值类型要改变
}
题目变量比较多,还是用题目中给出的名称。
接下来处理的是爬井过程和天数处理
int a, b, h, gao, tian = 0; // 定义变量
cin >> a >> b >> h; // 输入
gao = a; // 把第一个白天的高度算上去
while(gao < h){ // 没爬到井口就继续循环
tian++; // 天数加一
gao = gao + a - b; // 处理白天、晚上的高度(井的高度)
}
因为我们提前把高度增加了一天,但总天数有没有改变,所以输出的时候要再加上一天。
cout << tian + 1;
最后,放完整代码:
#include<bits/stdc++.h>
#define int long long // 宏命令,可省略
using namespace std;
signed main(){ // 因为将int定义为“long long”,mian函数返回值类型要改变
int a, b, h, gao, tian = 0; // 定义变量
cin >> a >> b >> h; // 输入
gao = a; // 把第一个白天的高度算上去
while(gao < h){ // 没爬到井口就继续循环
tian++; // 天数加一
gao = gao + a - b; // 处理白天、晚上的高度(井的高度)
}
cout << tian + 1;
}
验证时间!
现在整道题已经写完了,验证一下
输入:
3 2 10
输出:
8