初识枚举------还剩多少个1

        因为博主是名大学生,距离考试仅仅只有20多天了,所以要开始备考,上一章我提到过要写一篇关于深度优先搜索的文章,可是篇幅太长,如果赶时间制作的话,文章质量必然会下降,这是我不能接受的,所以抱歉要鸽一小段时间,在此期间我会不定时的发布一些简单的问题来帮助大家巩固基础共同进步。

问题1:什么是枚举。

        枚举这个概念对于大家来说一定很清晰了,所以就不花太大的篇幅来讲,简单的总结就是,罗列所有的元素。比如我让你从一堆大米里面挑出唯一一粒黑米,那么从这堆米里面一粒一粒的挑出来寻找也属于枚举,重要的一点是:枚举不是简单的查找,而是“操作”。过段时间要讲的深度优先搜索会讲走迷宫,既然走,就有上下左右方向,而我们要枚举所有方向的可能。言尽于此,开始步入正题。

问题2:题目

        

        题目来自“头歌实践操作平台”,这也是我认为最适合新手的实践刷题操作平台,包含很多计算机领域的知识可以免费获取,大家如果感觉其他平台的题目难度太大可以试试这个(用了人家的图片得帮人家宣传一下不是?)。

        现在我们来刨析下这个问题,首先n个零的意思是如果这段数据开始全是n个0,不存在其他数据。大家通过前面的解释应该可以反应过来这是个枚举题目。题目提到了执行n次操作,那么肯定是个循环了,具体是什么循环就看每个人的理解了,我认为for循环应该更容易理解,

for(int i = 1;i<=n;i++);        这一句是不是挺好理解的,循环n次,但是我们还要,操作i的倍数,那该怎么办呢,可以使用第二层循环。

for(int j = i;j<=n;j+=i);        是不是感觉醍醐灌顶,这也是一个求倍数的好方法。

等到两层循环枚举都结束后,我们还要统计1的个数,所以还要再来一次枚举循环。

问题3:具体代码

        

#include<stdio.h>
int main(void)
{    
    int count = 0;
//统计1的个数,初始化为1。
    int arr[100] = { 0 };//提前将数组元素全初始化为0。
    int n;//有n个0
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
//第一层循环执行操作
    {
        for (int j = i; j <= n; j += i)
//编号倍数
            if (arr[j])//如果是1就反转成0
                arr[j] = 0;
            else
                arr[j] = 1;
//否则反转成1
    }
    for (int i = 1; i <= n; i++)
//遍历查找。
        if (arr[i])
            count += 1;

    printf("%d", count);//输出验证
}

问题4:可能存在的疑问

        可能会有同学疑惑,为什么不用输入n个0,因为我们已经初始化数组全部为0了,而且我们还知道有n个0,所以直接从数组截取n个连续存储单元的0就可以了。

        

码字过程中可能会有错别字影响观感,望见谅。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值