数字1亿里面有多少个1呢

乍看这题真够唬人的,群里看到这个题目后争先恐后的说看法。最简单的办法不外乎就是遍历每个数,然后toString() 看看里面有多少个1,最后全部加起来,这是我们得到标准答案的办法。

群里3个人写了3个笨方法都跑出来了,3个笨方法,呵呵 有意思,笨方法也不一样。 程序的实现真是变幻莫测。

view sourceprint?01 var re = /1{1}/g;

02

03 var max = 1 * 10000 * 10000;

04

05 getTotal(f);

06 getTotal(f1);

07 getTotal(f2);

08

09 function getTotal(func)

10 {

11 var total = 0;

12 var begin = new Date();

13 for(var i= 1 ;i <= max;i++)

14 {

15 total += func(i);

16 }

17 var end = new Date();

18 var timespan = end - begin;

19 alert("开始时间:"+begin + "\n 结束时间:"+end +"\n总耗时:"+timespan + "毫秒 \n 总数:"+total);

20 }

21

22 function f(num)

23 {

24 var t = 0;

25 while(num)

26 {

27 if(num < 10){ if(num==1)t++;break;}

28 var i = num % 10;

29 if(i == 1) t++;

30 num = parseInt(num / 10);

31 }

32 return t;

33 }

34

35 function f1(num)

36 {

37 var str = num.toString()

38 var t = 0;

39 for(var i=0;i<str.length;i++)

40 {

41 if(str.charAt(i)=="1") t++;

42 }

43 return t;

44 }

45

46 function f2(num)

47 {

48 var str = num.toString();

49 var t = 0;

50 while(re.exec(str))

51 {

52 t++;

53 }

54 return t;

55 }

当数量少的时候第一种最快,显然嘛,没有处理字符串的步骤。按理说数量越大他越有优势。 可是实测结果,3个都差不多。但是用C#跑的话,第一个明显越来越有优势。。。。

但是出题人肯定不是这样想的,很多人都在说自己的技巧与看法,我也思考了很久。

先拿 100来说 ,100里面有多少个1?

view sourceprint?01 10

02 11

03 12

04 13

05 14

06 15

07 16

08 17

09 18

10 19

11 01

12 11

13 21

14 31

15 41

16 51

17 61

18 71

19 81

20 91

故意这么排列是我们可以把 0~99看作是 1个长度为2的数组, 1位为1时,2位的可能性是10,2位为1时1位的可能性为10,所以 0~99应该有20个1,而100有1个所以是21个。

999就应该是 1*10*10 + 10*1*10 + 10*10*1 = 300

400呢? 因为首位只能出现0~3 ,所以应该是 1*10*10 + 4*1*10 + 4*1*10

4 0000 0000 应该是 1 * (10^8) + 4*(10^7) * 8 = 420000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值