博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 百鸡百钱(暴力破解的一些想法)
阅读量:350 次
发布时间:2019-03-04

本文共 1772 字,大约阅读时间需要 5 分钟。

                 Python中的百鸡百钱经典暴力算法

   算法内有很多套路,比如,二分法,二叉树法,循环迭代法,冒泡排序法,暴力破解法等等各种各样的算法,这些算法针对不同的模型,模型就先不解释了,我们今天主要讨论的是暴力破解法也称作穷举法,这种算法相当对得起它的名字,因为暴力所以相对简单,适用人群是喜欢暴力的,简单的人群,但可能不是最高效的。简单来说,优点:此算法简单,暴力,效果直观,缺点:运行效率较低,对内存等消耗比较大。下面开始讲解百鸡百钱。

 

百钱百鸡:我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

译文:公鸡一只5元,母鸡一只3元,小鸡3只1元。如何用100元买100只鸡。其中公鸡,母鸡,小鸡的数量各是多少?

根据题意,可以得出,两个100,公鸡数目加母鸡数目加小鸡数目等于100,总的价钱等于100.也就是说,假设公鸡数目等于x,

母鸡数目等于y,小鸡数目等于z,那么,

5x+3y+z/3=100

x+y+z=100

现在x,y,z的值分别是多少?

使用python解答如下:

count=0#循环次数的计数,从零开始for x in range(1000):#range(?)这个数值为任意都可以,后面讲解这个数值,也就是for循环范围的作用    for y in range(1000):#同上。        count+=1#每一次循环后加1,以记录循环次数        z=100-x-y        if 5*x+3*y+z/3==100 and z%3==0:#如果每个种类价格相加等于100为真           print('公鸡:%d,,母鸡%d,小鸡:%d'%(x,y,z))#打印结果,结果为字符串           print(count)#打印循环总次数#程序运行结果为:公鸡:0,,母鸡25,小鸡:7526公鸡:4,,母鸡18,小鸡:784019公鸡:8,,母鸡11,小鸡:818012公鸡:12,,母鸡4,小鸡:8412005也就是说总共循环了12005次。有四个符合条件的选项

修改循环的次数,看看会发生什么?

count=0for x in range(100):    for y in range(100):        count+=1        z=100-x-y        if 5*x+3*y+z/3==100 and z%3==0:           print('公鸡:%d,,母鸡%d,小鸡:%d'%(x,y,z))           print(count)#运行结果:公鸡:0,,母鸡25,小鸡:7526公鸡:4,,母鸡18,小鸡:78419公鸡:8,,母鸡11,小鸡:81812公鸡:12,,母鸡4,小鸡:841205可以发现循环次数减少了,也就是说,效率提高了,循环次数减少意味着内存的消耗以及运行时间的减少

再次修改循环次数,答案彻底揭晓:

count=0for x in range(20):    for y in range(33):        count+=1        z=100-x-y        if 5*x+3*y+z/3==100 and z%3==0:           print('公鸡:%d,,母鸡%d,小鸡:%d'%(x,y,z))           print(count)#运行结果:公鸡:0,,母鸡25,小鸡:7526公鸡:4,,母鸡18,小鸡:78155公鸡:8,,母鸡11,小鸡:81284公鸡:12,,母鸡4,小鸡:84401#为什么循环次数是20和33呢?因为,假设全部买公鸡,公鸡单价是5,100元只能最多买20只公鸡,也就是假设#5x=100,那么x=20#同理,母鸡最多是33,因为3y=100,那么y=33.3333....#那么,z%3,也就是小鸡的数目必定除以3等于0,这个条件其实可以不需要,因为总共是三个数字,#x和y的值已经确定了,那么z的值必定可以确定。因为只有三类,所以for循环只需要二层循环,#z由 z=100-x-y来确定。最后说一句,z%3==0这个条件不需要,这个条件无关循环次数。

 

 

 

 

转载地址:http://hakr.baihongyu.com/

你可能感兴趣的文章