循环入门题单精讲

P5718 【深基4.例2】找最小值

本题是要求出n个数字中最小的,所以我们只需要用一个变量储存截至目前的最小值,然后每次读入一个数字,如果比最小值更小就更新最小值就行

需要注意的是这个值刚开始要设的比较大,否则可能n个数字每个都比他大,导致没有被更新,从而得到错误答案

对于本题,因为\(a_i \leq 1000\),所以我们只要把初始值设置成1001就一定会被更新

实现如下:

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int ans=1001;
	for(int i=1;i<=n;i++) 
	{
		int x;
		cin>>x;
		ans=min(ans,x);
	}
	cout<<ans; 
	return 0; 
} 


P1307 [NOIP 2011 普及组] 数字反转

本题将要求一个数字反着输出,即每次输出最后一位,然后去掉就行

需要注意的有两点

第一,要从第一位非0开始输出

第二,数字为负数的情况

第一种情况我们只需要定义一个\(bool\)变量,初始为\(true\),当遇到非0数时就赋为\(false\)

当值为\(true\)的时候我们就不输出就行了

第二种情况也较好处理,我们只需要判断一个数字是不是负数,如果是就先输出一个负号,然后当成正数处理就行

还有一种特殊情况,输入为0的时候要直接输出0

实现如下:

#include<iostream>
using namespace std;
int main()
{
	int x;
	cin>>x;
	bool flag=true;
	if(x==0)//x为0直接输出0
	{
		cout<<x;
		return 0;
	}
	if(x<0)
	{
		cout<<"-";
		x=-x;
	}
	while(x)
	{
		if(x%10!=0)//不为0时,给flag赋值为flase 
		{
			flag=false;	
		}
		if(!flag)//!flag,即flag为false时输出,flag为true说明还没遇到非0数字,即要忽略的高位0 
		{
			cout<<x%10;//输出最后一位 
		}
		x/=10;//去掉最后一位 
	}
	return 0; 
} 

P1420 最长连号

对于本题,是个比较综合的循环入门题目,需要维护的东西比较多

首先,判断是不是连号,我们需要存下上一个数字是什么,来判断两个数字有没有连号

其次,因为会有很多连号,所以我们需要记录下当前的连号有多长

然后再记录目前为止最长的连号有多长,出现更长的就更新

实现如下:

#include<iostream>
using namespace std;
int main()
{
	int n;
	int lst=-1;//表示上一个数,一开始设为-1就不可能跟第一个数连上  
	int lennow=1;//表示当前连号的长度
	int ans=0;//表示最长连号的长度,即我们要求的答案
	cin>>n; 
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		if(x==lst+1)//如果这个数字跟上一个相连
		{
			lennow++;//说明当前连号长度变长了一位 
		} 
		else//如果不是连号
		{
			lennow=1;//开始统计从当前数字开始的连号,目前只有当前数字,所以是1 
		} 
		ans=max(ans,lennow);//根据当前连号长度更新最长连号 
		lst=x;//这个数已经用完,新的上一个数就是当前数 
	} 
	cout<<ans;
	return 0;
} 

P1075 [NOIP 2012 普及组] 质因数分解

本题主要涉及到一个数学知识,如果一个数字能分解成两个质数的乘机,那他就只有这一组非本身的因数

所以本题既然保证了给的数能够被两质数相乘得到,我们只需要从2开始找他的因数,先找到的就是较小的那个,那么一除就是较大的那个

实现如下:

#include<iostream>
using namespace std;
int main()
{
	int x;
	cin>>x;
	for(int i=2;i<x;i++)//从2开始,因为1一定是因数
	{
		if(x%i==0)//能整除,说明是因数
		{
			cout<<x/i;//输出较大的那个
			break;//结束整个循环 
		} 
	}
	return 0; 
}

P5721 【深基4.例6】数字直角三角形

本题需要学会循环嵌套

根据题意就是我们需要输出\(n\)行数字,长度从\(n\)到\(n-1\),这样一直递减到\(1\)

所以我们用二重循环,第一重循环是枚举行,第二重是枚举列,唯一需要注意的点是要固定输出两位,所以当小于10时要多输出一个10

实现如下:

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int cnt=1;//代表当前要输出的数字 
	for(int i=n;i>0;i--)//一共n行,所以循环n次,从大到小枚举是因为这样i可以代表当前行要输出几个数字
	{
		for(int j=1;j<=i;j++)//当前行要输出i个数字,所以循环i次 
		{
			if(cnt<10) cout<<"0";//如果小于十要用0补齐位数
			cout<<cnt;
			cnt++;//下一次输出下一个数字 
		}
		cout<<"\n";//每一行结束要换行 
	} 
	return 0;
} 

P1980 [NOIP 2013 普及组] 计数问题

本题需要for和while两个循环嵌套使用

首先枚举1到n的每个数显然可以用for循环

然后我们需要知道每个数字中x出现了多少次,其实就是每次取数字的最后一位,看是否为x,然后去掉这一位,继续看下一位

显然就与我们之前的翻转数字很像,所以用while循环解决

需要注意的是,我们不能直接去分解\(i\),即for循环的临时变量,因为直接分解之后\(i\)最后会变成0,然后进行自增之后变成1,导致一直在1进行无限循环

具体实现如下:

#include<iostream>
using namespace std;
int main()
{
	int n,x;
	cin>>n>>x;
	int ans=0;//记录答案
	for(int i=1;i<=n;i++) //枚举每个数字
	{
		int now=i;//分解i,记住不要直接分解i,否则i变化就不会按照我们预想的循环
		while(now)
		{
			if(now%10==x)//如果当前最后一位数等于x,说明出现了一次
			{
				ans++;//出现次数加一 
			}
			now/=10;//去掉最后一位 
		}	
	} 
	cout<<ans;
	return 0;
} 
posted @ 2026-10-14 15:23  罗小菜  阅读(5)  评论(0)    收藏  举报