人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
立即订阅
953 人已学习
课程目录
已更新 15 讲 / 共 32 讲
0/2登录后,你可以任选2讲全文学习。
开篇词 (1讲)
开篇词 | 别闹了,学编程 ≠ 学语言
免费
语言基础篇 (13讲)
01 | 学习编程,我到底该选择哪门语言?
02 | 第一个程序:教你输出彩色的文字
03 | 判断与循环:给你的程序加上处理逻辑
04 | 随机函数:随机实验真的可以算 π 值嘛?
05 | 数组:一秒钟,定义 1000 个变量
06 | 字符串:彻底被你忽略的 printf 的高级用法
做好闭环(一):不看答案可能就白学了
07 | 指针系列(一):记住,指针变量也是变量
08 | 指针系列(二):记住,指针变量也是变量
09 | 函数:自己动手实现低配版 scanf 函数
10 | 预处理命令(上):必须掌握的“黑魔法”,让编译器帮你写代码
11 | 预处理命令(下):必须掌握的“黑魔法”,让编译器帮你写代码
做好闭环(二):函数是压缩的数组,数组是展开的函数
测试篇 (1讲)
期中测试 | 给语言基础篇交一份满分答卷,去迎接新的挑战!
人人都能学会的编程入门课
登录|注册

05 | 数组:一秒钟,定义 1000 个变量

胡光 2020-01-14
你好,我是胡光,咱们又见面了。通过前几节的学习,你已经了解了基本的程序结构。我们来简单总结一下,其中第一种结构就是顺序结构,它指的是我们所写的按照顺序执行的代码,执行完上一行,再执行下一行这种的。第二种就是分支结构,主要是用 if 条件分支语句来实现,主要特征是根据表达式的真假,选择性地执行后续代码。最后一种就是循环结构,用来重复执行某段代码的结构。
如果把程序比喻成工厂的话,现在你的工厂中已经有了各种各样的流水线,但这个工厂只是能生产产品还不行,还需要有存储的空间。今天,我们来学习的就是如何创建和使用工厂中的库房,本节之后,你的程序工厂就可以开工了!

今日任务

先来看看今天这 10 分钟的小任务吧。今天的任务是这样的,程序中读入一个整数 n,假设 n 不会大于 1000,请输出 1 到 n 的每一个数字二进制表示中的 1 的个数。
我举个例子哈,当 n 等于 7 的时候,我们把 1 到 7 的每个数字的二进制表示罗列出来,会得到下表所示内容:
表1:1到7的二进制表示
根据表 1 中的内容,如果你的程序编写成功的话,程序应该分别输出 1、1、2、1、2、2、3,这些输出内容分别代表每个数字二进制表示中 1 的数量。
对于这个任务,你想写出来一个可行的程序不难,例如:我们可以循环 n 次,每次计算一个数字二进制中 1 的数量。怎么计算一个数字二进制中 1 的数量呢?这个问题,你可能想采用如下程序来进行实现:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《人人都能学会的编程入门课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(9)

  • Geek_Andy_Lee00
    老师,您给的示例代码中,10能被5整除,为啥也输出了呢

    作者回复: 啊,sorry,笔误,多写上去的!赞!👍

    2020-01-15
    1
    2
  • 一步
    为什么scanf(“%d”,&a);是用%d整数占位符替换的&a的地址,不应该是%p吗?

    作者回复: 后面讲到指针的时候,你就明白了。&a传入的是a的地址,这样scanf才能把处理结果放到变量a里面。

    2020-01-16
    1
  • 信念
    vim test10.cpp
    #include<stdio.h>

    int main(){
    int a;
    sizeof(a); // 计算 a 变量占用字节数量
    sizeof(int); // 计算一个整型元素占用字节数量
    return 0;
    }
    gcc test10.cpp
    ./a.out
    老师,我进行了上述操作,为什么屏幕上面没有任何回应呀?

    作者回复: 因为你没有输出啊!用printf输出sizeof的值

    2020-02-01
    1
  • 信念
    vim test09.cpp
    #include<stdio.h>
    int main(){
    int n, arr[1000];
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &arr[i]);
    return 0;
    }
    gcc test09.cpp
    ./a.out
    这是我的操作,请问老师下面我应该打什么命令呀?

    作者回复: 下面你就可以输入数据了,首先输入一个n的值,例如3,然后再输入n个值即可。

    2020-01-31
    1
  • 奔跑的八戒
    思考题:去掉倍数
    定义数组 a[m+1],初始化值为0
    想到最快的算法,把每个数的倍数[下标]的值置为1;
    输出值还为0的数组下标

    作者回复: yes!
    d(^_^o)

    2020-01-15
  • 奔跑的八戒
    感觉老师课程的步子跨度还是比较大的,真的小白如果不花几倍的时间吸收消化,还真容易扯着蛋的,哈哈。

    作者回复: d(^_^o)所以给大家推荐了三本书。资料比较多的内容,专栏里面就很少会讲,专栏里主要讲阻碍大家学习编程的部分。否则,32讲,可能才讲完语言。

    2020-01-15
  • 梅利奥猪猪毛丽莎肉酱
    嗯还是相对比较基础的,对于萌新来说建议老师在图5种补充一个y=*****000000,这样萌新会看的更加轻松,和x做对比的确就差个1,至于前面的*号为什么一致,也是因为与的运算,因为1&1=1, 0&0=0,然后在结合下面的程序看,一看就看懂了

    作者回复: (。ì _ í。)好的,谢谢你的建议,d(^_^o)

    2020-01-14
  • 徐洲更
    如果题目求的并不是1-n的1的数,而是n的1的数量,利用递推的解决方法的时间复杂度是不是就比最开始的方法高呢

    作者回复: 对的,如果单纯的只是求n中二进制表示1的数量的话,那么直接求就好了,用不着递推。前后是两种性质完全不同的题目。

    2020-01-14
    1
  • 行问
    以二进制数字 110 为例,末尾是 0,计数量 cnt 不进入计算;然后 110 除以 2,即去掉最后一位的 0,变成了 11,此时末尾是 1,计数量 cnt 就加 1;11 再除以 2,变成了 1,此时末尾是 1,计数量 cnt 再次加 1 。最后的 n 等于 1,再除以 2,n 变成了 0,循环结束。

    这个段落的叙述、逻辑,让初学者直接挂掉了。110 除以 2,即去掉最后一位的 0, 变成了 11。我在大脑、拿纸笔,反复的推算,它都不成立。以二进制除法?十进制除法?

    作者回复: 二进制除法

    2020-01-14
    2
收起评论
9
返回
顶部