目录
目录
质数、break语句和continue语句:质数口袋(P5723)
前言
今天是10月24日,程序员节。想到未来的我大概率也是个程序员,那今天也差不多是我的节日了!在这样一个有意义的日子里,不学点什么都对不起未来的自己,于是我趁下午没有线下课,赶紧到图书馆复习一下循环语句,为接下来学数组函数这些打好基础,以下就是我对洛谷深基里的题目和代码的理解。
知识积累
for语句和while语句
for循环语句
for循环语句的一般形式如下:
for ( 循环变量初始值;循环条件;每轮循环结束操作 ) {
循环体}
实质上,for后面括号里的语句存在的意义就是规定循环次数,下面用示例分析这一功能。
例1. 多行输出苹果
张三每吃一个苹果,都会在日记里写下自己今天到现在吃了几个苹果,为了巩固他的英语,他打算用英文来写,比如,他在吃完今天第五个苹果后,会写下“Today,I ate 5 apples.”。其它以此类推。要求写一个程序,当输入整数 n 时,输出 Today,I ate 5 apples. 。注意单复数变化。
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
/*int i=0 :定义一个整型变量i,
作为这个循环的计数器,
由于是在循环里定义的,
故其在循环外无意义;
另外,
定义的赋值是针对第一次循环的i,
之后的循环会直接跳过这一句;
i<n :判断是否进入循环体的条件,
n是用户输入的整数,
当i比n小时,
就会继续循环;
i++ :一次循环结束时的操作,
i加1,
然后再进入中间的条件判断,
在这个循环语句里,
i最后会加到n,
因为当i加到n-1时,
i还是小于n,
所以再进行一次循环,
最后加到n,
然后回到条件判断,
发现不满足i<n,
这时就会退出循环;
i从0加到n的过程中循环了n次,
这就体现了循环语句的意义;*/
cout<<"Today,I ate "<<n<<" app
le";
if(n!=0&&n!=1) cout<<"s";
cout<<"."<<endl;
}//若循环体不止一条语句,也需要用花括号括起;
return 0;
}
通过这道题,就可以理解for循环语句的意思了,循环语句括号里定义的变量 i 的用法之一就是计数,用来规定循环的次数,如果要循环 n 次,可以有 3 种写法,有时使用第三种会更方便:
for ( int i = 0 ; i < n ; i + + ) { }
for ( int i = 1 ; i < = n ; i + + ) { }
for ( int i = n ; i > 1 ; i - - ) { }
例2. 最值打擂(P5718)
题目描述:
给出 n 和 n 个整数,求这 n 个整数中最小值是什么。
输入格式:
第一行输入一个正整数 n,表示数字个数。
第二行输入 n 个非负整数,以空格隔开。
输出格式:
输出一个非负整数,表示这 n 个非负整数中的最小值。
#include<iostream>
using namespace std;
int main(){
int n,num,Min;
cin>>n;
cin>>Min;//第二行输入的第一个数;
for(int i=0;i<n-1;i++){
//这里注意是 i<n-1 ,
//因为第一次循环就是,
//第二行输入的第一个数和第二个数打擂,
//所以只要循环n-1次就行了;
cin>>num;
Min=min(num,Min);
//第二行输入的第一个数作为擂主(Min),
//接下来输入的数和他打擂,
//也就是比谁小,
//谁小谁就是新的擂主(Min);
}
cout<<Min<<endl;
return 0;
}
从这道题中,我们学到的不仅是如何通过循环来判断最值,还有更重要的,一次多输入的实现,这道题要求输入第二行是n个数,一次性输入n个数,然后让循环语句来判断最值,for循环语句会重复执行循环体里的输入,实际上是读取,每次读取一个数,这是一个很重要的方法,通过在for循环体里使用 cin 来实现单次交互的多个输入,利用for循环语句每次循环依次读取的特点,实现重复判断后只有单次输出。
例3. 分类平均(P5719)
题目描述:
给定 n 和 k,将从 1 到 n 之间的所有正整数可以分为两类:A 类数可以被 k 整除(也就是说是 k 的倍数),而 B 类数不能。请输出这两类数的平均数,精确到小数点后 1 位,用空格隔开。
数据保证两类数的个数都不会是 0。
输入格式:
输入两个正整数 n 与 k。
输出格式:
输出一行,两个实数,分别表示 A 类数与 B 类数的平均数。精确到小数点后一位。
#include<cstdio>
//由于本题需要输出数字保留小数,
//所以用C语言风格可以减少代码量;
using namespace std;
int main(){
int n,k;
int Asum=0,Bsum=0;
//循环体里需要的变量,
//一定要先赋值,
//否则没有初值就会报错;
scanf("%d %d",&n,&k);
for(int i=k;i<=n;i+=k)
/*定义的变量i在这里就不是用来计数的了,
理解这个地方需要先分析一下题目,
题目要求的是在从1到n的整数里,
找到所有等于k的整数倍的数,
所以,循环没有必要从1开始,
可以直接从k开始,因为k是k的1倍,
此后每经过一次循环,加一个k,
这样所有的被赋值的i就都是k的倍数,
减少了很多没必要的循环,值得学习。*/
Asum+=i;
Bsum=(1+n)*n/2-Asum;
//这里是算从1到n里不是k的倍数的数之和,
//巧妙地应用了求和公式,值得学习;
printf("%.1f ",double(Asum)/(n/k));
//这里的除数是 n/k ,
//其实就是这里所有k的倍数的数量,
//这样又避免了使用循环;
printf("%.1f",double(Bsum)/(n-n/k));
//这两行输出体现了C语言的优越性,
//使用占位符 %.1f ,
//将浮点数保留一位小数再输出,
//比起C++中使用setprecision()函数要方便得多。
return 0;
}
通过这道题,可以知道 for 语句括号里的变量 i 还可以有其他的使用方式,不一定要用来计数,可以通过赋给 i 题目要求输入的值,利用每轮结束操作来对 i 进行适当的处理,以期简化代码。
通过上面两题难度的对比,我们可知,for循环语句更适合明确知道重复次数的循环,这里的知道,指的是通过输入得知的循环次数,以及题目中暗含的循环次数。
while循环语句
while循环语句的一般形式如下:
while ( 循环成立条件 ){
循环体
}
相较于for循环语句的形式,while循环语句变得更简单,少了变量 i 和循环结束处理,循环结束处理其实可以放在循环体中,无伤大雅。但是,while循环最大的优点,其实是它更适用于重复次数未知的循环,仅需要条件判断来进行循环。while语句的功能通过下例来说明。
例4. 一尺之

本文作者在1024程序员节复习C++循环语句,为后续学习打基础。介绍了for、while、do - while循环语句的形式、适用场景,通过多个洛谷题目案例进行说明,还提及多重循环嵌套、循环结构程序设计经典案例,以及课后习题答案,同时讲解了质数、浮点数误差等相关知识。
最低0.47元/天 解锁文章
6498

被折叠的 条评论
为什么被折叠?



