灵机一动 | 第116期 不报七(答案)
本栏目精选刊登题友有价值的解答,供大家学习交流之用,欢迎各位题友积极参与!任何时候在公众号中回复期数“第116期”或题目名称“不报七”可查看本期问题及答案!
NO. 116
不报七
一队士兵排队报数。他们的长官在家族中排行第七,所以不让士兵们报“七”和所有带“七”的数字,因此6的后面是8,16后面是18,69的后面是80。最后一个士兵报的数是2048。总共有多少名士兵?
来源:Areteem魔法学园每日一题
问题分析解答
本期问题题友们的解答非常精彩,大家各显神通,给出了好几种解法,更有题友利用“九进制”来解,大获好评,请看“题友解答精选”。
题友解答精选
一、最简单的解法◎题友 @枯木的守望 的解答:
考虑1到1999和2000到2048两段。 1到1999,不含7的数有2×9×9×9-1=1457个(减1是去掉0); 2000到2048有49-5=44个。 综上,一共有1501个。
二、容斥原理◎题友 @Mr.胡xb Right的解答:
考虑0001到2048 找出不含7的数,记S为上面2048个数构成的集,A、B、C分别为S中个位、十位、百位上出现了数字7的集。则含7的数集可以用 A∪B∪C 表示,易知 |A|=205,|B|=200,|C|=200,|A∩B|=20,|B∩C|=20,|A∩C|=20,|A∩B∩C|=2,根据容斥原理 |A∪B∪C|=|A|+|B|+|C|-|A∩B|-|B∩C|-|A∩C|+|A∩B∩C|=547,故士兵数为2048547=1501。
◎题友 @毕盛的解答:
找出带7的数字个数就行。2000以后有5个,主要看之前的个数,这是个排列组合问题。百位数带7的个数:2×10×10=200;十位数带7的个数:2×10×10=200;个位数带7的个数:2×10×10=200;百十位数都带7的个数:2×10=20;百个位数都带7的个数:2×10=20;十个位数都带7的个数:2×10=20;百十个位数都带7的个数:2。那么2000之前所有带7的个数:200+200+200-20-20-20+2=542。士兵数目就是2048-542-5=1501。
三、进制法——最有创意的解法◎题友 @mathlu的解答:
进制换算。九进制里的标准符号系统A:“0,1,2,3,4,5,6,7,8”,用符号系统B:“0,1,2,3,4,5,6,8,9”表示。“2048”是在符号系统B下的表示,化成标准的符号系统A的表示是“2047”,而“2047”实际对应的十进制数是2*93+0*92+4*91+7*9o=1501,即实际的士兵数。该方法可以用于一般的情况。
四、分段计数法◎题友 @一只巴掌 的解答:
100以内有10+9=19个带7的数,1000以内有100+19*9=271个带7的数,2000以内有271*2=542个带7的数,余下48里有5个,总的带7的数有542+5=547个,故士兵数为2048—547=1501。
五、程序法(Python)◎题友 @Fred Liu 的解答:
python3.5.1 a = For i in range(1,2049): if str("7") in str(i): a.append(i) Print(2048-Len(a)) Output:1501
六、Excel法——最偷懒的方法◎题友 @阿拉丁神灯 的解答:
还有个偷懒的不用数学思维的方法:在excel中从1拉到2048,筛选文本不含7的,再看剩下数字多少个。
Excel截图
本期答案整理:子曰 编辑:子曰
感谢各位题友的积极参与,下期再见!
好玩的数学
微信号:mathfun
↑
好玩的数学以数学学习为主题,以传播数学文化为己任,以激发学习者学习数学的兴趣为目标,分享有用的数学知识、有趣的数学故事、传奇的数学人物等,为你展现一个有趣、好玩、丰富多彩的数学世界。
↓