转载出处:http://www.cnblogs.com/jy02414216/archive/2011/03/09/1977724.html

1位数的情况:

在解法二中已经分析过,大于等于1的时候,有1个,小于1就没有。

2位数的情况:

N=13,个位数出现的1的次数为2,分别为1和11,十位数出现1的次数为4,分别为10,11,12,13,所以f(N) = 2+4。

N=23,个位数出现的1的次数为3,分别为1,11,21,十位数出现1的次数为10,分别为10~19,f(N)=3+10。

由此我们发现,个位数出现1的次数不仅和个位数有关,和十位数也有关,如果个位数大于等于1,则个位数出现1的次数为十位数的数字加1;如果个位数为0,个位数出现1的次数等于十位数数字。而十位数上出现1的次数也不仅和十位数相关,也和个位数相关:如果十位数字等于1,则十位数上出现1的次数为个位数的数字加1,假如十位数大于1,则十位数上出现1的次数为10。

3位数的情况:

N=123

个位出现1的个数为13:1,11,21,…,91,101,111,121

十位出现1的个数为20:10~19,110~119

百位出现1的个数为24:100~123

我们可以继续分析4位数,5位数,推导出下面一般情况:

假设N,我们要计算百位上出现1的次数,将由三部分决定:百位上的数字,百位以上的数字,百位一下的数字。

如果百位上的数字为0,则百位上出现1的次数仅由更高位决定,比如12013,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,共1200个。等于更高位数字乘以当前位数,即12 * 100。

如果百位上的数字大于1,则百位上出现1的次数仅由更高位决定,比如12213,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,12100~12199共1300个。等于更高位数字加1乘以当前位数,即(12 + 1)*100。

        如果百位上的数字为1,则百位上出现1的次数不仅受更高位影响,还受低位影响。例如12113,受高位影响出现1的情况:100~199,1100~1199,2100~2199,…,11100~11199,共1200个,但它还受低位影响,出现1的情况是12100~12113,共114个,等于低位数字113+1。

综合以上分析,写出如下代码:

  
1 public long CountOne2(long n) 2 { 3 long count = 0; 4 long i = 1; 5 long current = 0,after = 0,before = 0; 6 while((n / i) != 0) 7 { 8 current = (n / i) % 10; 9 before = n / (i * 10);10 after = n - (n / i) * i;11 12 if (current > 1)13 count = count + (before + 1) * i;14 else if (current == 0)15 count = count + before * i;16 else if(current == 1)17 count = count + before * i + after + 1;18 19 i = i * 10;20 }21 return count;22 23 }

此算法的时间复杂度仅为O(lgN),且没有递归保存现场的消耗和堆栈溢出的问题。

编程之美--数字1的个数相关推荐

  1. 编程之美二进制一的个数

    编程之美关于求一个整数二进制数一的个数后面的一道思考题. 1.A和B两个数,将A变成B,所需要改变的数字个数(二进制数). 异或求出异或值二进制包含的1的个数. #include <stdio. ...

  2. 编程之美---数字之魅

    最近上算法课程老师要求我们阅读<<编程之美>>这本书,我从中找出来两个简单的问题,论述解决的高效算法: 一.求二进制数中1的个数 (1)各种实现办法代码如下: /*** 计算一 ...

  3. 编程之美——数字哑谜

    题目: 有一个9位数abcdefghi的各位数字都不相同且全都不为0,并且二位数ab可被2整除,三位数abc可被3整除,四位数abcd可被4整除,依次类推,九位数abcdefghi可被9带队,请问这个 ...

  4. 编程之美-数字哑谜和回文方法整理

    [问题描述] 问题1的方法一: 问题1的方法二: 问题2的方法:

  5. 编程之美计算0到N中包含数字1的个数

    转自:http://blog.csdn.net/hongjuntu123/article/details/8743266 有这样一个函数f(n),对于任意正整数n,它表示从 0 到 n 之间出现&qu ...

  6. 编程之美系列之一——阶乘的运算

    前言:       本人一直以来都对算法很有兴趣,前些日子拿到<编程之美>这本书,爱不释手,遂有意将书中的一些本人觉得较有意思的题目以及自己的心得拿出来与大家分享,共同讨论,共同进步. 需 ...

  7. 精选的一些《编程之美》相关资料

    又要到一年的招聘季了,肯定又有很多人开始啃<编程之美>了吧.这本书从开阔视野的角度来说很好,不过限于篇幅,有的问题并没有讲清楚(甚至问题叙述模棱两可.被标榜为"鼓励同面试官交流以 ...

  8. 《编程之美》 查找最大(小)的k个元素

    http://blog.csdn.net/v_july_v/article/details/6370650 http://blog.csdn.net/insistgogo/article/detail ...

  9. 编程之美 笔记之——24点游戏

    原著中给出了两种解法:穷举和分治.后来加上去除冗余括号等操作,自己写了四个实现代码,但完全还是用的原著中的算法思想.暂且把自己的实现过程记录下来. 自己的第一种代码实现,完全穷举,没有任何的优化.代码 ...

最新文章

  1. Ubuntu 10.10 安装 libx11-dev
  2. Linu 修改maven的setting保护文件
  3. python培训班价格-北京Python班
  4. 记录爬取信用中国,里面的行政许可内容,行政处罚,守信激励的内容,并以excel形式显示
  5. Web Storage API的介绍和使用
  6. cd短是什么意思_每日命令|pwd、cd
  7. 【转载】要有梦想-创造卓越的职业生涯
  8. 面试官:说说你知道多少种线程池拒绝策略
  9. Bootstrap 警告框
  10. [linux-脚本]shebang(shabang #!)
  11. spring事务源码分析结合mybatis源码(二)
  12. CSS基本知识—浮动
  13. centos7改语言包
  14. win10风格美化以及新建系统后优化
  15. 怎样看出一个人有数学天赋?
  16. 【PCL自学:Segmentation3】基于PCL的点云分割:区域增长分割
  17. 商城类小程序开发全过程(附源码)
  18. 服部周作《麦肯锡晋升法则》读书笔记 I
  19. 神奇的“TexturePacker”
  20. 7-3 重要的话说三遍 (5分)

热门文章

  1. 【考研数学】 罗尔定理的证明
  2. ChatGPT将批量文档翻译成中文的方法
  3. ORACLE查看建表语句DDL
  4. 社区团购系统和运作模式
  5. 轮回 第七章 突变
  6. Python之仿QQ运动周报篇(纯数据,不含图形化页面)
  7. 使用pdfjs-dist绘制pdf文件
  8. suid(特殊权限位)提权
  9. 什么样的商品详情页才能打动消费者
  10. 基友和闺蜜的终极差别