算法:计算十进制数字在二进制表示1的个数,

题目一

计算十进制数字在二进制表示 1 的个数

举个例子:

十进制数字为 1 时,它的二进制表示是 001,二进制表示 1 的个数为 1;

十进制数字为 2 时,它的二进制表示是 010,二进制表示 1 的个数为 1;

十进制数字为 3 时,它的二进制表示是 011,二进制表示 1 的个数为 2;

十进制数字为 4 时,它的二进制表示是 100,二进制表示 1 的个数为 1;

十进制数字为 5 时,它的二进制表示是 101,二进制表示 1 的个数为 2;

十进制数字为 6 时,它的二进制表示是 110,二进制表示 1 的个数为 2;

十进制数字为 7 时,它的二进制表示是 111,二进制表示 1 的个数为 3;

时间复杂度 O(logn) 的解法

对于这个题目比较容易想到的是如下代码:

int count = 0;

while(n != 0)

{

if(n % 2 == 1)

{

count++;

}

n = n >> 1;

}

上述代码主要做了两个步骤:

n % 2 表示对数字求模运算,也就是计算二进制的末尾是 1 还是 0,如果二进制的末尾是 1 ,则 count 自增,count 表示的是二进制表示 1 的个数;

n = n >> 1 表示把二进制往右移走一位,比如十进制数字 7 的二进制表示是 111 ,那么通过右移一位后,则变成 011。

这个解决方式虽然能计算出二进制表示 1 的个数,但是我们可以发现这个解法的时间复杂度是 O(logn),比如当 n 为 7 时,它的二进制表示是 111,那么它将会循环 3 次,也就是非常接近 log 以 2 为底 7 的对数的值。

题目二

程序读入一个整数 n,假设 n 不会大于 1000,请输出 1 到 n 每个数字的二进制表示 1 的个数。

时间复杂度 O(nlogn) 的解法

可能有的小伙伴说,这题目二还不简单?直接把上面的解法,增加个 for 循环不就得了。

int main()

{

int i, j, n, count;

scanf("%d", &n);

for(i = 1; i <= n; i++)

{

j = i;

count = 0;

while(j != 0)

{

if(j % 2 == 1)

{

count++;

}

j = j >> 1;

}

printf("number:%d, count:%d\n", i, count);

}

return 0;

}

假设输入 7,则输出结果:

number:1, count:1

number:2, count:1

number:3, count:2

number:4, count:1

number:5, count:2

number:6, count:2

number:7, count:3

number:8, count:1

没错,用上述的解法增加个 for 循环,确实可以解决题目二的要求,这值得鼓励,但是程序的时间复杂度是时间复杂度 O(nlogn) ,运行效率不高,所以我们必须要有种精神,就是要用时间复杂度最少的方式去解决算法的问题,这样才能一次一次的进步。

时间复杂度 O(n) 的解法

请先观察下面的位运算性质:

y = x & (x - 1)

我们看到,x 和与 x -1 这两个数字做按位与运算,所以我们要以二进制的角度去思考这个问题。

比如:

假设 x 是 3,它的二进制是 011;

那么 x - 1 就是 2,它的二进制是 010;

x & (x - 1) 运算后的二进制就是 010。

那么 x & (x - 1) 实际效果等效于去掉 x 二进制表示中的最后一位 1,从而我们发现原来 y 变量与 x 变量在二进制表示中,只差一个 1。

如果我们用一个数组 f 记录相应数字二进制表示中 1 的数量,那么 f[i] 数组存放的值是 i 这个数字二进制表示中 1 的数量,从而我们可以推导得到 f[i] = f[i & (i - 1)] + 1,也就是说 i 数字比 i & (i - 1) 数字的二进制表示中的 1 的数量要多一个,这样我们通过一步计算就得到 f[i] 的结果,也就是相应数字二进制表示中 1 的数量结果。

代码如下:

int main()

{

int n,i;

int f[1001];

f[0] = 0;

scanf("%d", &n);

for(i = 1; i <= n; i++)

{

f[i] = f[i & (i - 1)] + 1;

}

for(i = 1; i <= n; i++)

{

printf("%d ", f[i]);

}

printf("\n");

return 0;

}

这个程序的过程如下:

首先先读入一个整数 n,代表要求解的范围;

然后循环 n 次,每一次通过 f[i] = f[i & (i - 1)] + 1 计算得到 f[i] 的值,也就是数字的二进制表示 1 的个数;

最后输出 1 到 n 中每个数字二进制表示中 1 的个数。

针对这个解法,程序的时间复杂度是 O(n)。

http://www.dengb.com/Cyy/1390440.htmlwww.dengb.comtruehttp://www.dengb.com/Cyy/1390440.htmlTechArticle算法:计算十进制数字在二进制表示1的个数, 题目一 计算十进制数字在二进制表示 1 的个数 举个例子: 十进制数字为 1 时,它的二进制表...

c语言x在二进制表示下1的个数,算法:计算十进制数字在二进制表示1的个数,...相关推荐

  1. c语言使用求余方式的转化为二进制程序,C语言第三讲 程序结构 (下).ppt

    <C语言第三讲 程序结构 (下).ppt>由会员分享,可在线阅读,更多相关<C语言第三讲 程序结构 (下).ppt(24页珍藏版)>请在人人文库网上搜索. 1.1,第三讲 程序 ...

  2. c语言 二级菜单_收下计算机二级秘笈,考场上说好不哭!

    计算机二级考试火热进行中~ 听说有些人明天考试 今天才记起来自己报名了 听说还有些同学 准备明天在考场上重新"编写"office运行法则 当然 还有很多同学现在正在抓紧时间复习吧 ...

  3. 二进制浮点数下的四舍五入

    二进制浮点数下的四舍五入 文章目录 二进制浮点数下的四舍五入 1. 前言 2. 浮点数 在解决问题之前,我们需要来了解一下什么是浮点数. 3. 计算精度 4. 四舍五入问题 5 . 总结 1. 前言 ...

  4. c语言scanf(%*c?,sex),计算机等级考试二级C语言考前密卷[2]下

    (26)下面程序的输出结果是__________. #define P1(x)printf(x) main() { char d[]."p": Pl(d): P1("d& ...

  5. python能在哪些系统上运行_中国大学MOOC:Python语言可以在哪些操作系统下运行______。...

    中国大学MOOC:Python语言可以在哪些操作系统下运行______. 正常人一出生其颈部有()条横向皱纹,属于正常生理现象.A:1--3B:5--6C:4--5D:3--4 在Al海区实现船对岸遇 ...

  6. R语言ggplot2可视化分组变量下的数据分布(线条、色彩配置)、WVPlots包的ShadowHist函数比较分组下的数据直方图、ggplot2分面图facet_wrap可视化分组变量下的数据分布

    R语言ggplot2可视化分组变量下的数据分布(线条.色彩配置).WVPlots包的ShadowHist函数比较分组下的数据直方图.ggplot2分面图facet_wrap可视化分组变量下的数据分布 ...

  7. 【Go语言实战】13. Go语言context标准库(下)

    13. Go语言context标准库(下) 1. API函数 2. 辅助函数 3. context的用法 4. 使用context传递数据真的那么好吗? 参考资料 接着上一届,我们继续学习Go语言的C ...

  8. 二级c语言编译完程序如何运行,计算机二级C语言辅导:C++环境下编译和运行c语言...

    一 单个文件运行 1 打开vc++出现如图 2 从file菜单中选择"new"→c++source file如图 3 单击"--"命令按扭,在choose di ...

  9. Linux下使用C语言查找一个文件夹下指定扩展名的所有文件

    最近在linux下要干点和c语言相关的任务,其中涉及使用C语言查找一个文件夹下指定扩展名的所有文件,我去开始在网上查找后粘贴后不能用,最后发现是windows下才能使用.最后找到了一篇不错的文章,ht ...

最新文章

  1. 安卓界面之Toolbar上手
  2. 内存的静态分配和动态分配的区别【转】 静态分配内存与动态分配内存的区别
  3. 电脑记事本_带日历的电脑桌面记事本?
  4. UDP模式与TCP模式的区别
  5. jquery ajax xml attribute,获得jQuery ajax和asp.net webmethod xml响应工作
  6. python 字符串%和format_Python必懂知识点,格式化字符串,到底用.format还是%
  7. jq 点击事件 调用
  8. 【上汽零束SOA】云管端一体化SOA软件平台系列介绍之四:车云一体架构篇
  9. QGIS基本功 | 12 图层的混合模式
  10. vue中prop验证、类型检查及注意事项
  11. JavaWeb之上传与下载
  12. 纸质的报销单错了就得重新来,可不可以填写电子报销单?
  13. 1028 大数乘法 V2(NTT or FTT)
  14. 关于laravel下composer安装excel插件
  15. 计算机西方经济学试题,西方经济学的习题与答案
  16. 要找工科男朋友的N个理由
  17. 对载荷谱进行雨流计数的几个主要步骤(以四点雨流计数为例)
  18. 读洛克的《政府论》下篇
  19. B站又备战虚拟主播了
  20. 有趣的个人云平台 – Sandstorm

热门文章

  1. 由于找不到PBSYS90.dll,无法继续执行代码。重新安装程序可能会解决此问题!
  2. 卷积神经网络(CNN)张量(图像)的尺寸和参数计算(深度学习)
  3. LeetCode简单题之分糖果 II
  4. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
  5. Computer OS系统基本原理
  6. nvGRAPH原理概述
  7. CVPR2020:三维实例分割与目标检测
  8. 客快物流大数据项目(五十六): 编写SparkSession对象工具类
  9. 2021年大数据HBase(十):Apache Phoenix的基本入门操作
  10. TypeError: ord() expected a character, but string of length 6 found