读《编程之美》中 1的数目 的笔记

  1. /**
  2.      * 计算1~limit之间,总共1出现的次数 如 1~13 1出现的次数是6
  3.      */
  4.     static void total1times(int limit){
  5.         int current=0;//当前位
  6.         int height=0;//高位
  7.         int lower=0;//低位 
  8.         int count=0;//总记录数
  9.         int factor=1;//需要计算1出现的次数 (因数)
  10.         while(limit/factor!=0){
  11.             lower=limit-(limit/factor)*factor;//低位
  12.             current=(limit/factor)%10;//计算当前位数  
  13.             height=limit/(factor*10);//计算高位
  14.             switch(current){
  15.             case 0://如果当前位上的数==0 ,则 count=最高位*因数  如 12013  = 12*100 
  16.                 count+=height*factor;
  17.                 break;
  18.             case 1://如果当前位上的数==0 ,则 count=最高位*因数  如 12113  = 12*100+114     114=(100~113)
  19.                 count+=height*factor+lower+1;
  20.                 break;
  21.             default://否则说明>1 则是最高位+1 *因数
  22.                 count+=(height+1)*factor;
  23.                 break;
  24.             }
  25.             factor*=10;
  26.         }
  27.         
  28.         System.out.println("1~"+limit+"之间1出现的次数为: "+count);
  29.     }
  30.     
  31.     /**
  32.      * 解题步骤:
  33.      * 如:115
  34.      * 先将数分解为 高位,当前位,低位 
  35.      *  按一定的规则计算,1出现次数与当前位上的数之间的关系  从《编程之美》章节 [1的数目] 中领悟如下
  36.      *   
  37.      *   (1):当前位上的数字=0时 ,1出现的次数=高位*当前位+低位+1
  38.      *   (2):当前位上的数字=1时,1出现的次数=高位*当前位+低位+1
  39.      *   (3):当前位上的数字>1时,1出现的次数=高位+1*当前位
  40.      *  如,一开始 115的当前位是 5 高位是11 低位是 0
  41.      *  5>1 则按规则3 为 11+1*1(1为当前位)=12
  42.      *  循环到第二次 当前位是 1 高位是1 低位是 1
  43.      *  1==1 则按规则2 为 1*10+5+1=16
  44.      *  循环到第三次 当前位是 1 高位是0 低位是 15
  45.      *  1==1 则按规则2 为 0*100+15+1=16
  46.      *  
  47.      *  则最终结果为 个位出现1的次数  +  十位出现1的次数 + 百位出现1的次数   12+16+16=44
  48.      */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值