注册 登录
编程论坛 Python论坛

经典数字游戏,求解法

Python_Toni 发布于 2019-09-18 19:30, 1960 次点击
#一筐鸡蛋:
#1个1个拿,正好拿完。
#2个2个拿,还剩1个。
#3个3个拿,正好拿完。
#4个4个拿,还剩1个。
#5个5个拿,还剩4个。
#6个6个拿,还剩3个。
#7个7个拿,正好拿完。
#8个8个拿,还剩1个。
#9个9个拿,正好拿完。
#10个10个拿,剩9个
#问筐里最少有多少鸡蛋?

这是个经典数字游戏题目,类似变形有楼梯阶数和韩信点兵(韩信有士兵1500人,战死几百人之后集合,2人一排,多1个,3人一排,正好。。。类似)

言归正传,我用的解法很粗暴,定范围去撞大运,觉得不能算是个解法,

for a in range(9, 10000):
    if a % 10 == 9 and a % 9 == 0 and a % 8 == 1 and a % 7 == 0 and a % 6 == 3 and a % 5 == 4 and a % 4 == 1 and a % 3 == 0 and a % 2 == 1:
     print(a)

运行结果:
1449
3969
6489
9009

求高手出招!



5 回复
#2
林月儿2019-09-18 20:49
这个好像跟具体编程语言没啥关系
#3
fall_bernana2019-09-19 09:10
回复 楼主 Python_Toni
一次7个和一次9个能拿完.就是应该既是7的倍数也是9的倍数.所以最小公约数是63.一次2个还剩一个. 所以是单数,所以1x63 ,3x63这样的筛选.一次10个剩下9个,所以个位数是9 ,那乘数的个位也要是3,所以只能是3x63,13x63,23x63,这个比你这个暴力列举法要快很多

[此贴子已经被作者于2019-9-19 09:19编辑过]

#4
Python_Toni2019-09-19 14:46
回复 3楼 fall_bernana
手工算当然可以,但是如果条件继续往上增加,(11个11拿,。。。15个,20个拿),最小数可能上万了,难度就会越来越大。

据说,这是一道奥数题。我只是觉得应该可以有解法,而不是通过撞,或者手算。
#5
wp2319572019-09-20 08:58
回复 4楼 Python_Toni
计算机最擅长的就是暴力

程序代码:

a=1
while True:
    if a % 10 == 9 and a % 9 == 0 and a % 8 == 1 and a % 7 == 0 and a % 6 == 3 and a % 5 == 4 and a % 4 == 1 and a % 3 == 0 and a % 2 == 1:
       print(a)
       break
    else:
      a+=1

'''
e:\pytest>python ex33.py
1449
'''      
#6
Python_Toni2019-09-20 13:46
回复 5楼 wp231957


谢谢!
1