【洛谷】洛谷深基学习记录 第四章 循环程序结构设计

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

目录

目录

前言

知识积累

for语句和while语句

for循环语句

while循环语句

do-while循环语句

 多重循环嵌套

数字三角形

阶乘

数字出现次数

循环结构程序设计经典案例

省略循环体:级数求和(P1035)

省略循环条件:金币(P2669)

自加自减语句:数列求和(P5722)

浮点数误差与死循环:数列求和

质数、break语句和continue语句:质数口袋(P5723)

课后习题答案

习题4-1

习题4-2

习题4-3  数字反转(P1037)

习题4-4  斐波那契数列(P1720)

习题4-5  求极差(P5724)

习题4-6  最长连号(P1420)

习题4-7  质因数分解(P1075)

习题4-8  求三角形(P5725)

习题4-9  打分(P5726)

习题4-10  Davor(P4956)

习题4-11  津津的储蓄计划(P1089)


前言

       今天是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. 一尺之

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值