编程之美:数"1"的个数,培养数学功底.

 

问题描述:1的数目.

 

给定一个十进制数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有1的个数.

 

思路: 我也看了一下.
给LZ举个简单的例子,让楼主了解一下规律吧...

先举一个基础概念: 例如我们要找6出现的次数, 假设页数共有87页.

计算方式: 逐位计算6的出现次数. 

开始计算: 

个位数出现6的情况有:06 16 26 36 ..66..86 ,一共出现9次.
十位数出现6的情况有:60 61 .66...69 ,一共出现10次.

那么,87页中一共出现了多少次6?    是不是简单的9+10呢?
答案是: 就是9+10, 计算个位时会计算一次66,算1次,计算十位时又会计算上66,算1次,那10+9=19不就多算了一次么? 不是的,因为66中出现了2个6,在个位时66算作1次,十位时66算作1次,加起来恰好就是66中有2个6的意思,所以这种逐位计算的方式并没有错,巧妙的计算正确了.

明白了这个基础,我们就可以不在乎重复情况,想办法逐位数出6出现的次数就可以了.

下面以一个5位数页码的百位为例,计算百位出现6的次数,讲一下规律性....

1. 百位数字小于6的情况.

例如:页数为12450, 百位是4.  
百位出现6的次数是多少呢?    开始计算:
600-699, 有100次
1600-1699,有100次
2600-2699,有100次
3600-3699,有100次
4600-4699,有100次
...
...
9600-9699,有100次
10600-10699,100 次
11600-11699,100次
12600-12699 ,这是不可能的- -..最大才12450,这很明显受限制于百位的4,如果不是4,是一个6或者7,8,那么12600-12699就可以算进来了,是吧.

所以百位6出现了多少次?    数一数,一共有几个100,一共12个100,所以一共出现了12*100=1200次.

从最后的记过,发现了100与4所在的百位数是相关的...即我们要算的是百位出现6的次数,那么就是乘100,算千位出现6的次数,那么就是乘1000.   12又是什么呢?  12就是12450中,百位之前的那个数.

2.百位数字是6.

举个例子12650.

有了上边的理解,我们直接开始算.
600-699
1600-1699
....
11600-11699
12600-12650       ******* 
好了,百位出现6的情况都列举出来了.
一共有多少种呢?   除了打*****的那一行,之前的总和是: (12)*100=1200次,此外还有*****那一行,出现了50+1=51次.

好了,那么百位数字等于6的情况下,百位数字出现6的总次数=12*100+(50+1).
发现12是12650中,百位数左边的数字12, 50是百位数字右边的数字50, 所以计算百位数字出现6的次数的表达式为:  左边数字*所在位(这里是100)+(右边数字+1).  这个公式对于计算其他位出现6的次数也是一样的,例如:
12650,计算千位出现6的次数=1*1000+(650+1)

3.百位数字大于6

这里,也直接举例子看看行了.
12750. 计算百位出现6的次数.

600-699
........
12600-12699

一共出现了(12+1)*100=1300次。

公式是: (左边数字+1)*所在位(这里是100)

比如求12750的千位出现6的次数,为:  (1+1)*1000=2000次

应该能看懂吧...

求一个数在一本书中出现的次数,就是对这个数的每一位都运用上边3种情况进行分类计算.
最终将每一位计算的结果加起来就是这个数在整本书中出现的次数.

如果你要求0-9每一个数字出现的次数,就把上边3种情况的判定6改成判定9就直接用了..

         

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值