while语句例题专题
一、语法
while 循环适合"循环次数不提前固定"的场景。
基本语法:
cpp
while (条件) {
循环体;
}
示例:输出 1 到 5
cpp
int i = 1;
while (i <= 5) {
cout << i << " ";
i++;
}
二、例题详解
例题1:小鱼会有危险吗
- 题目链接:P1426 小鱼会有危险吗
题目描述
小鱼从 A 点向右游,第一秒游 7 米,之后每秒游程变为上一秒的 98%。
探测器中心在 s 米处,左右 x 米为探测范围。
若小鱼进入探测范围后,下一秒不能游出范围则危险,输出 y;否则输出 n。
输入格式
一行两个实数 s 和 x。
输出格式
输出 y 或 n。
输入输出样例
输入:
text
14 1
输出:
text
n
思路讲解
用 while 模拟每一秒游动:
n记录已经游过的总距离,y记录当前这一秒能游的距离;- 当
n < s - x时,说明还没进入探测范围左边界,继续模拟; - 到达边界后,判断"下一秒结束时"是否还能留在范围内;
- 依据判断输出
y或n。
参考代码
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
float s, x, n, y;
cin >> s >> x;
n = 0;
y = 7;
while (n < s - x) {
n += y;
y = y * 0.98;
}
if (n + y > s + x) {
cout << 'n';
} else {
cout << 'y';
}
return 0;
}
例题2:级数求和
- 题目链接:P1035 级数求和
题目描述
设 S_n = 1 + 1/2 + 1/3 + ... + 1/n。
输入整数 k,求最小的 n,使得 S_n > k。
输入格式
一个正整数 k。
输出格式
一个正整数 n。
输入输出样例
输入:
text
1
输出:
text
2
思路讲解
这是 while 的经典"循环到满足条件为止"模型:
sum初始为 0,i从 1 开始;- 每轮把
1.0 / i加到sum; - 当
sum > k时停止,并输出当前i。
参考代码
cpp
#include <iostream>
using namespace std;
int main(){
int k;
cin >> k;
double sum = 0.0;
int i = 1;
while(1){
sum += (1.0/i) ;
if(sum > k){
cout << i << endl;
break;
}
i++;
}
return 0;
}
例题3:一尺之棰
- 题目链接:P5720 一尺之棰
题目描述
第一天木棍长度为 a,从第二天起每天长度变为前一天的一半(向下取整)。
问第几天长度会变为 1。
输入格式
一个正整数 a。
输出格式
一个正整数,表示第几天变为 1。
输入输出样例
输入:
text
100
输出:
text
7
思路讲解
每天都做同一件事:a /= 2,直到 a == 1。
因此用 while (a > 1) 循环最直观,循环次数就是多经历的天数。
参考代码
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int a;
cin >> a;
int d = 1;
while (a > 1) {
d++;
a /= 2;
}
cout << d;
return 0;
}