1. /*************************************************************************
  2. > File Name: 30_NumerOf1.c
  3. > Author: Juntaran
  4. > Mail: JuntaranMail@gmail.com
  5. > Created Time: 2016年09月01日 星期四 20时46分06秒
  6. ************************************************************************/
  7.  
  8. #include <stdio.h>
  9.  
  10. // 计算1在n中出现的次数
  11. int CountOne(int n)
  12. {
  13. int count = ;
  14. for (; n > ; n /= )
  15. {
  16. if (n % == )
  17. count ++;
  18. }
  19. return count;
  20. }
  21.  
  22. int NumberOfOne(int n)
  23. {
  24. if (n <= )
  25. return ;
  26. int count = ;
  27. for (int i = ; i <= n; ++i)
  28. count += CountOne(i);
  29.  
  30. printf("1 appear %d times\n", count);
  31. return count;
  32. }
  33.  
  34. /*
  35. 数学公式法:
  36. 设定整数点(如1、10、100等等)作为位置点i(对应n的各位、十位、百位等等),
  37. 分别对每个数位上有多少包含1的点进行分析
  38. 根据设定的整数位置,对n进行分割,分为两部分,高位n/i,低位n%i
  39.  
  40. 当i表示百位,且百位对应的数>=2,如n=31456,i=100,则a=314,b=56,
  41. 此时百位为1的次数有a/10+1=32(最高两位0~31),
  42. 每一次都包含100个连续的点,即共有(a%10+1)*100个点的百位为1
  43.  
  44. 当i表示百位,且百位对应的数为1,如n=31156,i=100,则a=311,b=56,
  45. 此时百位对应的就是1,则共有a%10(最高两位0-30)次是包含100个连续点,
  46. 当最高两位为31(即a=311),本次只对应局部点00~56,共b+1次,
  47. 所有点加起来共有(a%10*100)+(b+1),这些点百位对应为1
  48.  
  49. 当i表示百位,且百位对应的数为0,如n=31056,i=100,则a=310,b=56,
  50. 此时百位为1的次数有a/10=31(最高两位0~30)
  51.  
  52. 综合以上三种情况,当百位对应0或>=2时,有(a+8)/10次包含所有100个点,
  53. 还有当百位为1(a%10==1),需要增加局部点b+1
  54.  
  55. 之所以补8,是因为当百位为0,则a/10==(a+8)/10,当百位>=2,补8会产生进位位,
  56. 效果等同于(a/10+1)
  57. */
  58.  
  59. int NumberOfOne2(int n)
  60. {
  61. int count = ;
  62. for (long long m = ; m <= n; m *= )
  63. {
  64. count = count + (n/m + ) / * m + (n/m % == ) * (n%m + );
  65. }
  66. printf("1 appear %d times\n", count);
  67. return count;
  68. }
  69.  
  70. int main()
  71. {
  72. int n = ;
  73. NumberOfOne(n);
  74. NumberOfOne2(n);
  75. }

剑指Offer30 从1到n整数出现1的个数的更多相关文章

  1. 剑指 Offer 43. 1~n 整数中 1 出现的次数 + 数位模拟 + 思维

    剑指 Offer 43. 1-n 整数中 1 出现的次数 Offer_43 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author ...

  2. 剑指Offer30——包含min函数的栈

    剑指Offer30--包含min函数的栈 1. 题目简述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min.push及pop的时间复杂度是O(1). 2. 题 ...

  3. 剑指Offer - 九度1513 - 二进制中1的个数

    剑指Offer - 九度1513 - 二进制中1的个数2013-11-29 23:35 题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. ...

  4. 剑指offer-面试题11.数值的整数次方

    题目:实现函数double Power(double base,int exponent),求base的 exponent次方.不得使用库函数,同时不需要考虑大数的问题. 这道题看似很简单: 然而需要 ...

  5. 剑指Offer 把字符串转换成整数

    题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法 ...

  6. 剑指offer 12:数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. public class Solution { public double P ...

  7. 剑指Offer——把字符串转换成整数

    题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0   输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果 ...

  8. 剑指offer--30.二叉搜索树的后序遍历序列

    正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...

  9. 剑指offer--15.把字符串转换成整数

    stringstream做这个真的很舒服 ------------------------------------------------------------------------------- ...

随机推荐

  1. 错误"因为数据库正在使用,所以无法获得对数据库的独占访问权"的解决方案

    今天在还原数据库的时候,提示"因为数据库正在使用,所以无法获得对数据库的独占访问权",无论我是重启数据库,还是重启计算机,都不能解决问题,多番尝试后,终于解决了该问题.现将引发该问 ...

  2. android 小知识点

    小知识点总结 1. android中MotionEvent.ACTION_CANCEL事件如何被触发? 对于这个问题,android文档的说明很简短,想看明白很难.国外一网页说的还比较详细,写在这里分 ...

  3. box-shadow 同时有内阴影和外发光效果

    box-shadow: 0px 0px 10px rgba(0,0,0,0.8) inset,0px 0px 5px rgba(200,200,200,0.5);

  4. C#调用webService的几种方法

    转自: WebClient 用法小结 http://www.cnblogs.com/hfliyi/archive/2012/08/21/2649892.html http://www.cnblogs. ...

  5. C#之 HashSet(临时笔记,未参考资料,请慎重)

    HashSet是一个集合,类似于DataSet,但是其主要用途是用来存放同一种类型的元素(string.row.table等),如果添加的元素跟定义时初始的类型不一致,就会直接编译失败. 例如: Ha ...

  6. Number

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt 概述 parseIn ...

  7. spring AOP Bean添加新方法

    目的:为studentAdditionalDetails中添加Student的showDetails()和ExtraShowDetails()两个方法 spring  中AOP能够为现有的方法添加额外 ...

  8. center os 6.5 vsftpd 登陆出现 530 错误拒绝 解决方法

    别管那么多 把 /etc/vsftpd/ftpusers  里面的用户名删掉就好了.

  9. missing artifact com.oracle:ojdbc14:jar:10.2.0.2.0解决办法

    下载jar,导入到maven中 下载:http://download.csdn.net/detail/spring123tt/6991897 cmd中输入: mvn install:install-f ...

  10. IDA Script: Remove empty auto labels

    http://simeonpilgrim.com/blog/2010/03/25/ida-script-remove-empty-auto-labels/ #include <idc.idc&g ...