当前位置:网站首页>第二十五章:一文掌握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)计数问题
边栏推荐
- SQL的通用语法和使用说明(图文)
- 使用npx -p @storybook/cli sb init安装失败,手把手搭建专属的storybook
- Use libcurl to upload the image of Opencv Mat to the file server, based on two methods of post request and ftp protocol
- Win11没有本地用户和组怎么解决
- General code for pytorch model to libtorch and onnx format
- Cmd Markdown 公式指导手册
- TCP三次握手、四次挥手
- 测试用例练习
- 推开机电的大门《电路》(一):电压,电流,参考方向
- 编译error D8021 :无效的数值参数“/Wextra” cl command line error d8021 invalid numeric argument ‘/wextra‘
猜你喜欢
随机推荐
Installation and configuration of Spark and related ecological components - quick recall
编译error D8021 :无效的数值参数“/Wextra” cl command line error d8021 invalid numeric argument ‘/wextra‘
网络安全抓包
golang之GMP调度模型
二叉树遍历之后序遍历(非递归、递归)入门详解
TypeScript 快速进阶
Win10电脑需要安装杀毒软件吗?
Yolov5 official code reading - prior to transmission
Codeforces Round #605 (Div. 3)
模板系列-二分
Based on the least squares linear regression equation coefficient estimation
CMAKE
Introduction to MATLAB drawing functions ezplot explanation
Doubled and sparse tables
Introduction to in-order traversal (non-recursive, recursive) after binary tree traversal
Open the door of electricity "Circuit" (1): voltage, current, reference direction
2.登录退出,登录状态检查,验证码
Win11 computer off for a period of time without operating network how to solve
Win11系统找不到dll文件怎么修复
一篇文章彻底理解Redis的持久化:RDB、AOF