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

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

一、基础语法回顾

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

cpp 复制代码
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,循环体为取模运算和整除赋值运算,并输出取模运算的结果。具体程序代码如下所示:

cpp 复制代码
#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中。具体程序代码如下:

cpp 复制代码
#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,具体程序代码如下:

cpp 复制代码
#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赋值给临时变量tmp
		while(tmp>0){//对该整数进行数位分离 
			if(tmp%10 == 1){//判断最低位是否为1
				sum++;//将1出现的次数进行自增运算 
			}
			tmp=tmp/10;//修改整数的值
		}
	}
	cout<<sum<<endl;//输出1出现的次数
	return 0;
}
相关推荐
飞yu流星6 分钟前
C++ 函数 模板
开发语言·c++·算法
没有名字的鬼11 分钟前
C_字符数组存储汉字字符串及其索引
c语言·开发语言·数据结构
pursuit_csdn13 分钟前
力扣 74. 搜索二维矩阵
算法·leetcode·矩阵
labuladuo52020 分钟前
洛谷 P8703 [蓝桥杯 2019 国 B] 最优包含(dp)
算法·蓝桥杯·动态规划
专注于开发微信小程序打工人22 分钟前
庐山派k230使用串口通信发送数据驱动四个轮子并且实现摄像头画面识别目标检测功能
开发语言·python
土豆凌凌七25 分钟前
GO:sync.Map
开发语言·后端·golang
Goldinger27 分钟前
vscode 配置c/c++环境 中文乱码
c语言·c++·vscode
重剑无锋102443 分钟前
【《python爬虫入门教程12--重剑无峰168》】
开发语言·爬虫·python
Milk夜雨1 小时前
C语言冒泡排序教程简介
数据结构·算法·排序算法
nSponge1 小时前
【Duilib】 List控件支持多选和获取选择的多条数据
c++·windows·工具