循环入门题单精讲
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;
}

浙公网安备 33010602011771号