<编程之美>2.4 1的数目的解释

原创 2015年11月20日 21:42:22

题目:给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。 


以下我自己一点理解,希望能帮到大家,有什么不对的请大家指出来。其实最重的是这种思路,把一个复杂的大问题,经分析,划分成小问题,依次解决。不过真的很难做到,慢慢努力吧。


书中第二解法的解释

按书中说法:

假设abcd是个4位数,求其中1—abcd中出现1的个数。把问题划分成求个位、十位、百位、千位出现1的次数,最后求和

书中拿百位举例。我也用百位举例,求百位出现1的次数。

百位把数字分成三部分:a, b, cd。a是高位值,b是当前位值,cd是低位值。

b有三种情况:

(1)b=0:这种情况,百位出现1至于高位相关。100--199, 1100--1199 ,------- (a-1)100--(a-1)199 有a*100。

(2)b=1:这种情况,其实就是在b=0的基础上,加上 a100--a1cd   cd+1个1, 既a*100+cd+1

(3)b>1:这种情况,b=0的基础上加上 a100---a199  100个1,既(a+1)*100 

其他位依次如此操作即可。


假设n是所给数字,

个位:高位值=n/(1*10) , 当前位值=n/(1)%10, 低位值=n-(n/1)*1     factor = 1

十位:高位值=n/(10*10) , 当前位值=n/(10)%10, 低位值=n-(n/10)*10     factor = 10

百位:高位值=n/(100*10) , 当前位值=n/(100)%10, 低位值=n-(n/100)*100   factor = 100

对任意位,factor为对应数值(1,10,100.....)

高位值=n/(factor*10) , 当前位值=n/(factor)%10, 低位值=n-(n/factor)*factor  


这样就可以写出代码:

public static int reserch2(int a) {
int n = 0;
int low = 0;
int hight = 0;
int current = 0;
int factor = 1;
while (a / factor != 0) {
low = a - (a / factor) * factor;
hight = a / (factor * 10);
current = (a / factor) % 10;
switch (current) {
case 0:
n += hight * factor;
break;
case 1:
n += hight * factor + low + 1;
break;
default:
n += (hight + 1) * factor;
break;
}
factor*=10;
}
return n;
}



编程之美2.4——“1”的数目

题目描述:给定一个正整数N,写出1到N(包含N)的所有正整数,然后数一下其中出现的所有N的个数。 举个例子,假设你输入的是11,则1到11的所有正整数为: 1,2,3,4,5,6,7,8,9,10...
  • u013220338
  • u013220338
  • 2015年09月12日 15:00
  • 468

编程之美 - 1 的数目

问题: 给定一个十进制整数N,写下从1开始到N的所有数字,然后数一下其中1的个数。 例如N = 16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13...
  • wangzhiyu1980
  • wangzhiyu1980
  • 2016年04月07日 21:53
  • 412

编程之美1:那些关于1的个数的经典面试题

那些关于1的个数的经典面试题好长时间没有练算法了,笔试题一做,发现非常吃力,所以近日来找来《编程之美》一书来看看练练。为了激励自己多练,楼楼可能会出个专栏什么的,感兴趣的同学我们可以一起抱团,楼楼也会...
  • XIAXIA__
  • XIAXIA__
  • 2015年04月09日 12:02
  • 2889

编程之美系列之栈和队列2—在O(1)的时间内得到队列的最大或者最小值

上一篇博客http://blog.csdn.net/kay_zhyu/article/details/8869542中提到,在O(1)的时间内取得栈的最大或者最小值,作法是利用一个辅助栈去动态的维护这...
  • kay_zhyu
  • kay_zhyu
  • 2013年04月30日 15:00
  • 2825

《编程之美》- 2.4 - 1的个数

题目 2.4 1的数目 给定一个十进制正整数N,写下从1开始,到N所有整数,然后数一下其中出现的所有“1”的个数。 例如:N = 2 则在1,2中只出现了1个“1” N = 12 则在1~12...
  • fly_yr
  • fly_yr
  • 2016年05月12日 16:40
  • 424

编程之美2.4 1的数目

题目描述: 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。 例如:N=2,1,2出现了1个“1”。 N=12,1,2,3,4,5,6,7,8,9,10,11,12。出现了5个“...
  • ycxmartin111111
  • ycxmartin111111
  • 2014年03月13日 00:23
  • 1055

[编程之美] 2.4 1的个数

给定一个十进制整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。...
  • ILOVEYOUXIAOWANGZI
  • ILOVEYOUXIAOWANGZI
  • 2014年03月06日 21:53
  • 679

编程之美 2.4 1的数目

这道题的意思是,给定一个数n,那么从1到n这n个数中,1出现了几次。这个问题开始看,肯定不容易做,往往都是利用最笨的方法,一个数一个数的找就行了,那么如果n很大,就需要非常多的时间了,书中提供了更好的...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2014年09月25日 16:33
  • 1564

编程之美2.4——1的数目

/*总体思路:先求个位上出现的1的个数,再找十位再找百位。。 先看个位找找规律:  5(05)     1    1  15        2    1,11    25        3 ...
  • wxl3105
  • wxl3105
  • 2012年06月10日 17:31
  • 1050

[编程之美2.4]1的数目

给定一个十进制正整数N,写下从1开始,到N的所有证书,然后数一下其中出现的所有的“1”的个数,例如 N = 2,写下1,2.这样出现了1一个“1”。 N = 12,我们会写下,1,2,3,4,5,...
  • qingmarch
  • qingmarch
  • 2013年04月10日 21:52
  • 327
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:<编程之美>2.4 1的数目的解释
举报原因:
原因补充:

(最多只允许输入30个字)