码迷,mamicode.com
首页 > 其他好文 > 详细

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数

时间:2014-07-07 18:57:02      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   html   算法   

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。

分析:首先最先想到的是遍历从1到n的每个数,判断每个数中包含1的个数,再相加。 时间复杂度:如果输入数字为n,n有O(logn)位,我们需要判断每个数字的每一位是不是为1,所以时间复杂度为O(n*logn)。如果输入数字很大的时候,就需要大量的计算,效率不高。

      接下来观察规律:

     从个位到最高位,我们判断每一位1出现的次数。比如

     对于数23                    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

     个位为1的数为01,11,21。次数为3

     十位为1的次数,10,11,12.13 14 15 16 17 18 19  次数为10次

 

   总结规律得到:

   在个位出现1的个数=n/10+(个位=0,0;个位>1,1;个位=1,低0位+1);

   十位位出现1的个数=n/100*10+(十位=0,0;十位>1,10,;十位=1,低一位+1);

   百位出现1的个数=n/1000*100+(百位=0,0;百位>1,100;百位=1,低两位+1);

 

  

手工求解:

125

个位=12+1

十位=10+10

百位=0+26

59个1

 

算法描述:

(1)求出所给正整数a的位数,假设为N,num保存1的个数

(2)另p=a,num+=p/10i*10i-1;(i=1...N-1);

(3)令p=a/10i-1;p=p%10,if(p==1) num+=a%10i-1+1;if(p>1) num+=10i-1;(i=1....N)

(4)printf(num);

  因为算法复杂度只和数字的位数有关,位数为logn位,所以总的时间复杂度为O(logn).

 

  参考:http://www.cnblogs.com/GoAhead/archive/2012/05/28/2521415.html

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数,布布扣,bubuko.com

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数

标签:style   blog   http   color   html   算法   

原文地址:http://www.cnblogs.com/menghuizuotian/p/3813449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!