zoukankan      html  css  js  c++  java
  • 剑指Offer30 从1到n整数出现1的个数

     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 = 0;
    14     for (; n > 0; n /= 10)
    15     {
    16         if (n % 10 == 1)
    17             count ++;
    18     }
    19     return count;
    20 }
    21 
    22 int NumberOfOne(int n)
    23 {
    24     if (n <= 0)
    25         return 0;
    26     int count = 0;
    27     for (int i = 0; i <= n; ++i)
    28         count += CountOne(i);
    29     
    30     printf("1 appear %d times
    ", 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 
    60 int NumberOfOne2(int n)
    61 {
    62     int count = 0;
    63     for (long long m = 1; m <= n; m *= 10)
    64     {
    65         count = count + (n/m + 8) / 10 * m + (n/m % 10 == 1) * (n%m + 1);
    66     }
    67     printf("1 appear %d times
    ", count);
    68     return count;
    69 }
    70 
    71 int main()
    72 {
    73     int n = 12;
    74     NumberOfOne(n);
    75     NumberOfOne2(n);
    76 }
  • 相关阅读:
    如何在Blog中使用feedburner管理RSS订阅
    网络基本功(八):细说TCP滑动窗口
    JAVA三大框架的各自作用
    NHibernate与EF(Entity Framework)的区别
    程序模拟浏览器请求及会话保持-python实现
    Netbeans7.4下搭建struts2.3.16
    解决Sqlite UTF-8中文数据格式在DOS窗口下中文乱码
    Android使用xml中定义的动画效果
    Android 之Activity切换动画效果
    设置ActioinBar 的背景色以及Title的字体颜色
  • 原文地址:https://www.cnblogs.com/Juntaran/p/5831295.html
Copyright © 2011-2022 走看看