当前位置: 首页 > news >正文

1的个数

int Count(unsigned int v)
{
    int num = 0;
    
    while(v)
    {
         v &= (v-1);
         num++;
    }
    return num;
}

这种方法速度比较快,其运算次数与输入n的大小无关,只与n中1的个数有关。如果n的二进制表示中有k个1,那么这个方法只需要循环k次即可。

其原理是不断清除n的二进制表示中最右边的1,同时计数器加1,直至n为0

对于int 型32位的呢

def NumberOf1( n):
    min_val=-2**31
    if n ==min_val:
        return 1
    if n>=0:
        num=0
    else:
        num=1
    while n!=0 and n>min_val:
        n&=n-1
        num+=1

    return num

 int型32位表示范围为-2^31~2^31-1,最高位表示符号位,负数比正数多一位,多的这以为就是100000000000000,就是-0,也就是-2^31。

在判断1的个数的时候,负数的符号位也为1,所以也要加入判断,所以如果n为负数,则初始化的时候,num=1

 

计算十进制数中1的个数

 给定一个数n,计算从1~n中所有数字中出现1的次数总和。

f(13)=6

f(23)=13

f(24)=14

通过分析发现:f(n)=个位出现1的次数+十位出现1的次数+百位出现1的次数+...

某一位出现1的个数总结,以十位为例

如果十位是0:以1101为列,十位出现1的个数10~19,110~119,210~219,...,910~919,1010~1019共计110个,说白了就是在十位出现1(10~19)的情况下,最高的两位可以不停的变化,从00~10,共00,01,02,..,10,共计11种情况,每种情况下都对应低位的(10~19)10个,所以共计110个出现1。总结为highNum*factor(如果是计算十位个数,factor=10,百位factor=100)

如果十位是1:同上分析,则为highNum*factor+lowerNum+1,多了一个低位数加1,就是既与高位数有关,也与低位数有关。

如果十位大于1:则为(highNum+1)*factor。

def sum1s(n):
    count=0
    factor=1
    while n//factor:
        lowerNum=n%factor
        currNum=(n//factor)%10
        highNum=n//(factor*10)
        if currNum==0:
            count+=highNum*factor
        elif currNum==1:
            count+=highNum*factor+lowerNum+1
        else:
            count+=(highNum+1)*factor
        factor*=10
    return count

 这样的话计算一个1~n数中,所有出现1的个数时间复杂度为O(log10(n)),也就是只与n的位数有关系了。

转载于:https://www.cnblogs.com/gczr/p/8086223.html

相关文章:

  • 机器学习之线性回归
  • [天下小黑盒]打地鼠小助手
  • SDN第四次上机作业
  • 让python和sublime text3结合起来
  • asp.net 初识
  • Spring transaction与EJB transaction的关系
  • (转载)(官方)UE4--图像编程----着色器开发
  • [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
  • EasyPlayerPro windows播放器本地音频播放音量控制实现
  • SQL Server索引内部结构:SQL Server索引的阶梯级别10
  • apache ant 修改java版本 方法之一
  • bzoj1911[Apio2010]特别行动队 斜率优化dp
  • 通俗理解webService及.net中的使用方法
  • PHP后门的eval类和system类 函数到底有哪些区别
  • mint-ui 填坑之路
  • 【EOS】Cleos基础
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Bytom交易说明(账户管理模式)
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • egg(89)--egg之redis的发布和订阅
  • github从入门到放弃(1)
  • JavaScript 基础知识 - 入门篇(一)
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Puppeteer:浏览器控制器
  • PV统计优化设计
  • React Native移动开发实战-3-实现页面间的数据传递
  • socket.io+express实现聊天室的思考(三)
  • Sublime text 3 3103 注册码
  • 分类模型——Logistics Regression
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 回顾2016
  • 基于web的全景—— Pannellum小试
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 通过git安装npm私有模块
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 移动端解决方案学习记录
  • const的用法,特别是用在函数前面与后面的区别
  • #### go map 底层结构 ####
  • (5)STL算法之复制
  • (Python第六天)文件处理
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm电影分享网站
  • (五)网络优化与超参数选择--九五小庞
  • (转)德国人的记事本
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .Net 代码性能 - (1)
  • .net(C#)中String.Format如何使用
  • .net生成的类,跨工程调用显示注释
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • @开发者,一文搞懂什么是 C# 计时器!
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [Angular] 笔记 20:NgContent
  • [Angular] 笔记 6:ngStyle