任务
程序中读入一个整数 n,假设 n 不会大于 1000,请输出 1 到 n 的每一个数字二进制表示中的 1 的个数。
当 n 等于 7 的时候,我们把 1 到 7 的每个数字的二进制表示罗列出来,会得到下表所示内容:
根据表中的内容,如果你的程序编写成功的话,程序应该分别输出 1、1、2、1、2、2、3,这些输出内容分别代表每个数字二进制表示中 1 的数量。
编码
思路
如果我们用一个数组 f 记录相应数字二进制表示中 1 的数量,那么 f[i] 就代表 i 这个数字二进制表示中 1 的数量,从而我们可以推导得到 f[i] = f[i & (i - 1)] + 1,也就是说 i 比 i & (i - 1) 这个数字的二进制表示中的 1 的数量要多一个,这样我们通过一步计算就得到 f[i] 的结果。
实现
1 |
|
思考题
1,去掉倍数
设计一个去掉倍数的程序,要求如下:
首先读入两个数字 n 和 m,n 的大小不会超过 10,m 的大小都不会超过 10000;
接下来读入 n 个各不相同的正整数,输出 1 到 m 中,有哪些数字无法被这 n 个正整数中任意的一个整除。
例子
1 | 输入 |
实现
1 |
|
小结
- 使用数组,可以很方便的定义出一组变量存储空间,数组下标从 0 开始。
- 数据的最基本存储单位是字节,每一个字节都有一个独一无二的地址。
- 一个变量占用若干个字节,第一个字节的地址,是这个变量的首地址,称为:变量地址。
- 字节是存储数据的最基本单位,比特是表示信息的最基本单位。