循环常见案例

循环这一章节的知识,是所有初学者都必须经过的坎!

之前学习的数据运算、分支判断,多多少少会跟现实世界有些联系,学起来不会感到完全陌生。

然而循环这一块,虽然现实世界中,很多事情也在不断重复,但大部分人不会使用循环这样的思维去看待现实世界中的重复问题,因此,当教程进入到循环这一章节时,会感觉到完全陌生。

学习方法只有多看多想多练,直到成为习惯和本能,如同呼吸。

本文总结了一些在开发中常见的循环问题,希望通过这样的总结,可以帮助你建立起循环的思维。

看本文的过程中,不要急功近利,一定要心平气和,慢慢看,慢慢想,自己再跟着每个案例写一次

建议你最好先去洗个脸( ̄▽ ̄)



循环指定的次数

有的时候,我们要做的事情,只是简单的重复某个行为指定的次数。

比如,输出100个星号,输出50个”你好”,保存10份内容完全相同的文件,宝宝吃饭的时候被要求再吃3口,等等等等。

面对这样的问题,在代码中可以使用下面的结构:

for(int i = 0; i < 次数; i++)
{
//重复的动作
}

比如,要输出10个星号,可以使用这样的代码:

for(int i = 0; i < 10; i++)
{
Console.Write("*");
}

由于i的取值是0-9,则刚好循环了10次,输出结果如下:

**********

遍历

遍历是循环中最常见的问题。

所谓遍历,是指有某个范围的样本数,需要把样本中的每个数据取出来一一分析。

比如,输出100-200之间的所有数字,它的样本范围就是100-200,需要你依次把样本中的每一个数据取出来输出。

再比如,将50-70之间的所有数字相加求和,它的样本范围就是50-70,需要你依次把样本中的每一个数据取出来累加。

这,就是遍历问题。

遇到遍历问题,绝大部分情况下,都需要使用一个循环变量,它从样本的起始值(或结束值)开始,每次递增(或递减),这样,就可以取到每一个样本的数据。

遍历问题的通用循环格式如下:

//方式一:顺序遍历
for (int i = 样本起始值; i <= 样本结束值; i++)
{
// 每一次进入循环体,i,就是取出的其中一个样本数据
}

//方式二:逆序遍历
for (int i = 样本结束值; i >= 样本起始值; i--)
{
// 每一次进入循环体,i,就是取出的其中一个样本数据
}

比如,一个简单的遍历问题,输出1-8之间的所有数字,可以使用以下的代码完成:

for (int i = 1; i <= 8; i++)
{
// 每一次进入循环体,i,就是取出的其中一个样本数据,输出该数据
Console.Write(i);
}

运行结果是:

12345678

当然,这只是一个最简单的遍历问题,遍历问题还会有很多的场景,下面,我将分别介绍这些常见的遍历场景。

遍历—样本筛选

有的时候,样本范围内的数据可能不是每一个我们都需要,而是只需要其中一部分,那么在遍历样本时,就需要对取出的每一个样本数据进行判断,看是否满足我们的需要,也就是要对样本进行筛选。

比如,输出1-10之间所有的奇数,虽然样本范围是1-10,但不是每一个样本数据都是我们需要的,因此,我需要对取出的每一个数据进行验证,看它是不是奇数,如果是,才输出。

可以使用下面的代码来完成输出1-10之间所有的奇数:

for (int i = 1; i <= 10; i++)
{
// 每一次进入循环体,i,就是取出的其中一个样本数据
// 判断该数据是不是奇数
if (i % 2 != 0)
{
Console.Write(i);// 该样本数据满足条件,输出
}
}

运行结果为:

13579

遍历—样本求和

有的时候,我们需要把样本范围内的所有数字相加,这就是求和问题。

面对求和的问题,可以使用这样的思路:在遍历之前,先准备好一个变量,值为0,然后取出样本的第一个数据,将变量的数据和第一个数据相加,然后再保存到变量中。然后对样本剩下的数据做同样的处理即可。

举个例子,比如让你对10-15之间的所有数字求和,可以使用如下的方案:

第一步:准备好一个变量,比如sum,让它的值为0

  • sum = 0;

第二步:将样本范围内的每一个数和变量sum中保存的值累加,然后再保存到sum中:

  • sum += 10; // sum:10
  • sum += 11; // sum: 21
  • sum += 12; // sum: 33
  • sum += 13; // sum: 46
  • sum += 14; // sum: 60
  • sum += 15; // sum: 75

第三步:当遍历结束后,变量sum中的值就是累加求和的结果。

把上面的例子转换为代码如下:

//第一步
int sum = 0;
//第二步
for (int i = 10; i <= 15; i++)
{
sum += i;
}
//第三步
Console.Write("和为:" + sum);

输出结果如下:

和为:75

这就是求和问题的做法,类似的累计问题也是同样的方案,比如求10-15之间所有数的乘积,可以使用下面的代码:

//第一步
int sum = 1; // 求乘积要从1开始
//第二步
for (int i = 10; i <= 15; i++)
{
sum *= i; // 使用累乘
}
//第三步
Console.Write("积为:" + sum);

运行结果为:

积为:3603600

遍历—样本计数

样本计数问题往往会和样本筛选问题合并使用。

它是指这么一种场景,有一个样本范围,需要计算该样本范围中满足条件的样本数据有多少个。

比如,55-66中有多少个数能同时被2和3整除。

可以使用如下的思路解决:

第一步,准备好一个变量num,该变量表示满足要求的样本数据数量,一开始的值为0。

  • int num = 0;

第二步,遍历样本,一个一个将样本数据拿出来,看看该样本数据是否满足要求,如果满足,将计数变量num自增1。

  • 55 不满足要求,什么也不做
  • 56 不满足要求,什么也不做
  • 57 不满足要求,什么也不做
  • 58 不满足要求,什么也不做
  • 59 不满足要求,什么也不做
  • 60 满足要求,num++ // num: 1
  • 61 不满足要求,什么也不做
  • 62 不满足要求,什么也不做
  • 63 不满足要求,什么也不做
  • 64 不满足要求,什么也不做
  • 65 不满足要求,什么也不做
  • 66 满足要求,num++ // num: 2

第三步,当遍历结束后,变量num中的值就是计数的结果。

把上面的例子转换为代码如下:

//第一步
int num = 0; // num表示计数的结果,在一开始,计数之前,为0
//第二步
for (int i = 55; i <= 66; i++)
{
if (i % 2 == 0 && i % 3 == 0)
{
num++;
}
}
//第三步
Console.Write("55-66中,共有" + num + "个数能同时整除2和3");

运行结果如下:

55-66中,共有2个数能同时整除23

计数问题有一个经典的场景,就是判断一个数是不是质数(素数)

什么是质数(素数)?质数(素数)是一个大于等于2的数,该数只能被1和自身整除。

这看上去不像是一个计数场景,甚至不像是任何一个遍历场景。先不着急,咱们一起分析一下。

既然质数只能被1和自身整除,换句话说,在1到该数之间,一定只有两个数能整除该数。比如,7是一个质数,因为1-7之间,只有两个数(1和7)能整除它。

仔细理解上面这段话,如果你理解了,就会发现这是一个什么问题呀?没错,这就是一个计数问题。

我们要判断一个数n是不是质数,只需要看1-n之间有多少个数能整除n,如果数目为2,它就是质数,否则,它就不是。

于是,可以使用下面的代码来判断:

int n = 3311; // 待判断的数n,假设它的值是3311

//下面是计数问题的代码
//第一步
int num = 0; //计数
//第二步,遍历范围1-n
for (int i = 1; i <= n; i++)
{
if (n % i == 0)
{
num++;//计数+1
}
}
//第三步,根据计数结果来判断
if (num == 2)
{
Console.Write(n + "是一个质数");
}
else
{
Console.Write(n + "不是一个质数");
}

执行结果:

3311不是一个质数

其他

有的时候,你面临的循环问题既不是固定次数的循环,也不是遍历问题,也有可能是遍历中几个问题的叠加。

比如,让你输出100-200之间的所有质数,你会怎么做呢?

它的代码格式如下:

for (int i = 100; i <= 200; i++)
{
//判断i是不是质数,如果是就输出
}

也就说,我只要解决如何判断i是不是质数即可,而判断质数的问题已经讲过,完整的代码如下:

for (int i = 100; i <= 200; i++)
{
//判断i是不是质数,如果是就输出
int num = 0;//计数
for (int j = 1; j <= i; j++)
{
if (i % j == 0)
{
num++; //找到了一个数能整除i,计数加1
}
}
if (num == 2)
{
Console.WriteLine(i);// 说明i是质数,输出它
}
}

总之,在面对这些问题的时候,只能具体问题具体分析,学习开发没有捷径可走(实际上,学习任何技术都是一样),更不能死记硬背,唯有多看多想多练

这就相当于是武侠世界中的修行,一开始你会痴迷于各种兵器和招式,而当你熟悉了各种兵器、见过太多的招式、练就了深厚的内力时,你就可以忘掉这一切,尽兴发挥,所向披靡。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值