当前位置:网站首页>第二十五章:一文掌握while循环
第二十五章:一文掌握while循环
2022-08-02 14:10:00 【WANGHAOXIN364】
while循环
一、引入背景
利用for语句编写程序时,大多数需要提前知道循环次数,如果遇到无法确定循环次数的问题就不好用了。当型循环语句(while循环)提供了解决这类问题的方法。
二、while循环的一般格式
while(循环条件表达式)
{
循环语句组;
}
Copy
对应运行流程图:

while循环语句的执行过程是:先求条件表达式的值,当值为真时,执行循环体;然后再次回到条件表达式,如果仍为真,继续执行循环体。反复操作上述两步,直到条件表达式的值为假时,跳出while循环,继续执行后面的语句。
如果一开始执行while循环的条件表达式时,条件就不成立,则不执行循环体的内容,直接跳出while循环。(循环次数为0)
举个具体的 程序实例 :
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i=5;
while(i>=1)
{
cout<<i<<"-我真棒!"<<endl;
i--;
}
}
Copy
程序运行结果如下图所示:

我们用一个表格模拟整个 while循环的过程 :
循环次数 | 循环条件的值 | 执行循环体的结果 |
---|---|---|
第1次 | 5>=1 -->真 | 显示“5-我真棒!”; i的值变为4 |
第2次 | 4>=1 -->真 | 显示“4-我真棒!”; i的值变为3 |
第3次 | 3>=1 -->真 | 显示“3-我真棒!”; i的值变为2 |
第4次 | 2>=1 -->真 | 显示“2-我真棒!”; i的值变为1 |
第5次 | 1>=1 -->真 | 显示“1-我真棒!”; i的值变为0 |
第6次 | 0>=1 -->假 | 跳出循环体 |
三、几道简单有趣的例题
1、求和
题目描述:已知Sn=1+2+3+4+....+n。请问n最小为几时,Sn的值会超过100?
输入格式:无。
输出格式:输出n的值。
问题分析:
(1)我们在for循环的学习过程中,常会接触到已知 n ,求 1+2+3+4+...+n 的和,可这道题恰好相反,它是已知总和,去求加到哪一个 n 的时候能得到这样的和。我们是不知道循环次数的,所以首选while循环解决问题。
(2)循环条件是啥?很显然就是 Sn<=100 。只有总和小于等于 100 时,我们才需要去不断做加法,一旦 Sn>100 了,求和应当立马结束。
(3)循环体是啥?当 Sn 没有超过 100 时,我们要做的只有一件事:让 Sn 的值继续更新变大,即加入新的n的值进去,也就是 Sn+=n。其中这个 n 从1开始不断变化,每加一个 n 后,n 的值就要更新成 n+1。
参考代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n=0,Sn=0;
while(Sn<=100)
{
n++;
Sn+=n;
}
cout<<n;
}
Copy
可能有同学会疑惑:为什么n的初始值是 0 不是 1 ?很简单,我想保持每一次循环中的 n 和 Sn 的值是保持同步的,比如说:某一次循环中 n 的值更新为 6 ,那Sn加进去的也一定是 6。这样做的好处时,跳出循环时的n的值一定就是那个导致 Sn 刚刚好超过 100 的“罪魁祸首”!
正确运行结果是14。
2、小球跳高
题目描述:一个小球从距离地面100米的高度下落,每一次落到地面上后,会继续弹起到原来一半的高度,然后继续下落。请问第几次下落后,弹起的高度低于0.5米?
输入格式:无。
输出格式:次数。
问题分析:
(1)通过题目的问题取向便可看出来,又是不知道循环次数的题目,当然首选while循环。
(2)找循环条件:弹起的高度低于0.5米时,计数工作结束,小球弹落的工作也结束,所以循环条件就是:高度不低于0.5米。
(3)循环体:当满足条件时,小球要不停地下落和弹起,伴随着这个过程,有2个量在变化:次数和高度。次数每次固定+1,高度则更新为上一次高度的一半。
参考代码(注意变量类型):
#include<bits/stdc++.h>
using namespace std;
int main()
{
double s=100; //s代表实时的高度
int num=0; //num代表当前下落的次数
while(s>0.5)
{
num++;
s/=2;
}
cout<<num;
}
Copy
正确运行结果是8。
总结及题单推荐:
上述2道例题中,关于while循环的特征非常明显:不知道具体循环次数,只知道循环终点时满足的情况。
类似特征的题目,都可以“照猫画虎”地搬运上述例题的解题过程。
这里给大家推荐一些相同特征的题目:
(1)小玉游泳
(2)小鱼航程
(3)角谷猜想
(4)隧道
(5)级数求和
(7)一尺之棰
四、while循环中一些重要的知识点
1、回文数判断
概念介绍:对于某一正整数a,如果a 的值和它的反转数的值 s 相等,那么a就是一个回文数。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,t,s=0;//a代表待判断数字, t是替罪羊,s是a的反转数
cin>>a;
t=a;//这一步非常关键,因为在后续判断中,需要保留待判断数字的原始值
while(t)//相当于while(t>0)
{
int ge=t%10;
s=s*10+ge;
t/=10;
}
if(a==s) cout<<"回文数";
else cout<<"非回文数";
}
Copy
2、位数统计
概念介绍:任意一个正整数a的位数是不固定的,当我们不知道a 的大小范围时,就要靠while循环+数位分离的知识解决统计位数的问题。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,s=0;//a代表待判断数字, s代表a的位数
cin>>a;
while(a)//相当于while(a>0)
{
a/=10; //a砍一位,s加一位 ,一直砍到a的值变成0
s++;
}
cout<<s;
}
Copy
3、求最大公约数
概念介绍:最大公约数的解法和“欧几里得算法”有重要联系,根据这个算法可知,a和b 的最大公约数 = b 和 a%b 的最大公约数。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,yushu;
cin>>a>>b;
yushu = a%b ;
while(yushu != 0 )
{
a = b;
b = yushu;
yushu = a%b;
}
cout<<a<<"和"<<b<<"的最大公约数是"<<b;
}
Copy
4、亲戚数判断
概念介绍:如果正整数a的某一位上是数字x,那么a就是x的亲戚数。(x为0-9之间的任意整数)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,x,flag=0;
cin>>a>>x;
while(a)
{
int ge=a%10;
if(ge==x)
{
flag=1;
break;
}
//else
//{
a/=10;
//}
}
if(flag==1) cout<<"是亲戚数";
else cout<<"不是亲戚数";
}
Copy
总结及题单推荐:
除了最大公约数,其他三个重要代码都和数位分离有很大关联,部分同类型题目中还会出现数组标记的考察哦!
推荐题单如下:
(1)1出现的次数
(2)数字反转
(3)统计
(4)粗心医生
(5)求车速
(6)分离整数的各个数位
(7)计数问题
边栏推荐
- Detailed explanation of Golang garbage collection mechanism
- 编译error D8021 :无效的数值参数“/Wextra” cl command line error d8021 invalid numeric argument ‘/wextra‘
- Codeforces Round #624 (Div. 3)
- pytorch模型转libtorch和onnx格式的通用代码
- Win11 keeps popping up User Account Control how to fix it
- Mysql connection error solution
- 测试用例练习
- pygame图像连续旋转
- win11一直弹出用户账户控制怎么解决
- Please make sure you have the correct access rights and the repository exists. Problem solved
猜你喜欢
cmake configure libtorch error Failed to compute shorthash for libnvrtc.so
How to solve Win11 without local users and groups
Win10 cannot directly use photo viewer to open the picture
Mysql连接错误解决
1.开发社区首页,注册
Mysql的锁
基于矩阵计算的线性回归分析方程中系数的估计
Win7 encounters an error and cannot boot into the desktop normally, how to solve it?
Redis的线程模型
推开机电的大门《电路》(三):说说不一样的电阻与电导
随机推荐
Spark及相关生态组件安装配置——快速回忆
测试用例练习
二叉树创建之层次法入门详解
Letter combination of LeetCode2 phone number
Open the door of electricity "Circuit" (1): voltage, current, reference direction
The SSE instructions into ARM NEON
C语言函数参数传递模式入门详解
cmake configure libtorch error Failed to compute shorthash for libnvrtc.so
Codeforces Round #624 (Div. 3)
Introduction to in-order traversal (non-recursive, recursive) after binary tree traversal
Doubled and sparse tables
What should I do if the Win10 system sets the application identity to automatically prompt for access denied?
Daily - Notes
背包问题-动态规划-理论篇
Network Security Packet Capture
How to set the win10 taskbar does not merge icons
vscode镜像
Win10安装了固态硬盘还是有明显卡顿怎么办?
项目:数据库表的梳理
MATLAB图形加标注的基本方法入门简介