欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)

2025/1/9 11:35:00 来源:https://blog.csdn.net/ALISHENGYA/article/details/145019299  浏览:    关键词:全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)

在 C++ 编程的世界里,循环结构是掌控程序流程的关键工具之一,而while循环更是其中的经典。它就像一个不知疲倦的小卫士,只要条件满足,就会持续执行特定的代码块,可以解决诸多复杂的编程任务。本文就一同深入探索while循环的精彩应用。

一、基础语法回顾

while循环的基本语法形式简洁明了:


while (条件表达式) {// 循环体,包含需要重复执行的代码
}

当程序运行到while语句时,首先会对 “条件表达式” 进行求值。若结果为true(在 C++ 中,非零值即为true),则进入循环体执行其中的代码;执行完毕后,再次回到条件表达式处进行判断,如此往复,直到条件表达式的值变为false,此时程序跳出while循环,继续往后执行其他代码。

二、常见应用场景

实战训练1—分离整数的各个数位

问题描述:

给定一个整数 n(1≤n≤100000000),要求从个位开始分离出它的每一位数字。从个位开始按照从低位到高位的顺序依次输出每一位数字。

输入格式:

一行一个整数,输入一个整数n,整数n在1到100000000 之间。

输出格式:

一行,从个位开始按照从低位到高位的顺序依次输出每一位数字。数字之间以一个空格分开。

输入输出样例:

输入样例1

输出样例1

12345

5 4 3 2 1

输入样例2

输出样例2

985211

1 1 2 5 8 9

问题分析:

根据题意,要从个位开始分离出整数的每一位数字,可以利用取模运算%和整除运算/的特性。对于输入的整数n,对n进行求模运算可以得到个位数字,例如对于数字123,123%10的结果是3,这就是想要分离出的个位数字;在得到个位数字并输出后,为了继续分离下一位数字,需要将 n 更新为去掉当前个位数字的新数字,这可以通过整除运算来实现,例如对于数字 123,在输出 3 后,将 n 更新为 123 / 10,结果是 12,这样就可以继续分离下一位数字。重复上述过程,直到 n 为 0,此时表示已经将所有位的数字都分离并输出。由于并不知道n的位数,所以使用while循环来实现,条件表达式为n>0,循环体为取模运算和整除赋值运算,并输出取模运算的结果。具体程序代码如下所示:


#include<bits/stdc++.h>
using namespace std;
int main(){int n;//定义一个整数n cin>>n;//输入整数n的值 while(n>0){//只要n不等于0,就执行循环体 cout<<n%10<<" ";//首先输入最低位数,最低位数为n对10取模运算 ,并输出最低位数 n = n/10;//将n除以10之后重新赋值给n }return 0;
}

实战训练2—数字统计问题

问题描述:

请统计某个给定范围[L,R] 的所有整数中,数字2出现的次数。比如给定范围 [2,22],数字 2在数2中出现了1次,在数12中出现1次,在数 20 中出现1次,在数21 中出现1次,在数 22中出现2次,所以数字2在该范围内一共出现了6次。

输入格式:

输入一行,输入两个整数L和R,这两个整数之间用空格隔开。

输出格式:

输出一行一个整数,表示2出现的次数。

输入输出样例:

输入样例1

输出样例1

4 23

6

输入样例2

输出样例2

10 30 

11

问题分析:

对于范围 [L, R] 内的每一个整数,都需要进行数位分离求出其每一位数字,以便检查其中数字 2 的出现情况,分离整数各个数位可以使用实战训练1中的思想来解决,即使用while循环,条件表达式为该整数大于0,循环体内执行取模和整数运算;由于需要对区间内所有的整数都要执行一次操作,所以该问题是嵌套循环,内层循环为分离数位的while循环,外层循环次数确定,外层循环可以采用for来实现,循环变量起始值为L,终值为R,更新表达式为自增运算,while循环是for的循环体;此外还需要一个变量 sum来存储数字 2 在整个范围 [L, R] 内的出现总次数。遍历范围 [L, R] 内的每一个整数,对于每个整数,使用上述的数字分离和检查逻辑来计算数字2的出现次数,并累加到 sum中。具体程序代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){int l,r,sum=0;//定义整数的范围变量l和r,以及数字2出现的总次数变量sum,并将sum初始化为0 cin>>l>>r;//输入l和r的值 for(int i=l;i<=r;i++){//外层循环,体现对于[l,r]范围的每一个整数都执行找数字2的操作 int tmp = i;//数位分离时要修改该整数,为了防止i发生变换,将i赋值给临时变量tmp while(tmp){//对该整数进行数位分离 if(tmp%10 == 2){//判断最低位是否为2 sum++;//将2出现的次数进行自增运算 }tmp /= 10;//修改整数的值 }}cout<<sum<<endl;//输出2出现的次数 return 0;
}

实战训练3—数1的计数问题

问题描述:

给定一个正整数 n(1≤n≤10000),写下从1到n的所有整数,然后数一下其中出现的数字1的个数。例如当n=2 时,写下1,2。这样只出现了1 个1;当n=12 时,写下1,2,3,4,5,6,7,8,9,10,11,12。这样出现了5 个1。

输入格式:

输入一行一个整数n。

输出格式:

输出一行一个整数表示数字1出现的个数。

输入输出样例:

输入样例1

输出样例1

20

12

输入样例2

输出样例2

30

13

问题分析:

根据题意求解数字1出现的次数,该题目和训练2的题目类似,不同之处在于首先范围的变化,训练2为输入范围 [L, R] ,而该题目是输入一个整数n,范围变成[1,n],其次训练2为判断数字2的次数,而该题目为数字1的个数,剩余内容一样,可以参考训练2,具体程序代码如下:


#include<bits/stdc++.h>
using namespace std;
int main() {int n,sum = 0;//定义整数的右范围变量n,以及数字1出现的总次数变量sum,并将sum初始化为0 cin>>n;//输入n的值 for(int i=1;i<=n;i++){//外层循环,体现对于[1,n]范围的每一个整数都执行找数字2的操作int tmp=i;//数位分离时要修改该整数,为了防止i发生变换,将i赋值给临时变量tmpwhile(tmp>0){//对该整数进行数位分离 if(tmp%10 == 1){//判断最低位是否为1sum++;//将1出现的次数进行自增运算 }tmp=tmp/10;//修改整数的值}}cout<<sum<<endl;//输出1出现的次数return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com