python作业求解

编写程序,用户输入一个三位以上的整数,输出其百位以上的数字。例如用户输入1234,则程序输出12。(提示:使用整除运算。)

x=input("请输入一个三位以上的数字:")
 print("你输入的数字比三位数小")
 

2、编写程序,生成包含20个随机数的列表,然后将前10个元素升序排列,后10个元素降序排列,并输出结果。

3、求解任意一个一元二次方程,从键盘输入各项系数,输出求解结果。

s=input("请输入你要求的一元二次方程的三个参数a、b、c,用逗号隔开")

关于问题求解,书中有一个实际的案例。

上图是一个交叉路口的模型,现在问题是,怎么安排红绿灯才可以保证相应的行驶路线互不交错。

第一步,就是把问题弄清楚。

怎么能让每一条行驶路线不冲突呢?

其实,就是给所有的行驶路线分组(这样保证了安全问题,不会撞车)。

并且,所做的分组应该尽可能大一些,用以提高路口的通行效率(经济问题,如果一个组一条路线,虽然不会撞车,但是等待的时间会很长)。

有了上面的最大化分组的想法。那么就进一步将问题具体化。

现在问题就转化为,给这13条路线分组,使其各个组不冲突,并且最大化组中的成员。

在书中引出了一个冲突图,用来表示各个路线的冲突。

其中图中元素称之为顶点,连线称之为边或者弧。相互之间有边的顶点称为邻接顶点。

安全分组就变成了另外一种说法,为冲突图中的顶点确定一种分组,保证属于同一分组的所有顶点互不邻接。

到了这里就完了第一步,将问题严格化。

第二步,就是进行数据结构与算法设计

使用什么样的数据结构来表示冲突中的形式路线,又用哪种算法来计算分组。

书中首先提到了一个最佳着色算法,其实就是著名的四色问题,这个算法能找到最佳的分组方案。但是由于算法代价太高,效率不高。因此着重介绍了一个更为简单的算法。

那就是贪心法。它的基本想法是这样的:利用当时掌握的信息,尽可能地向得到解的方向前进,知道不能继续再换一个方法。

那么在这个例子中的具体表现就是:就是确定一个分组,这个分组里的成员互相都不邻接,也就是说不能冲突。当这个分组完成之后,再确定下一个分组。

按照这个方法,上面的例子分组就是:

while 存在未着色顶点:

  在未着色顶点中给尽量多的无连边的点着色(构建一个分组)

  记录新着色的顶点组

    将v从verts中取出

循环结束时,new_grouo是可以用一种新的颜色着色的顶点集合

其实,上面的伪代码已经接近于具体程序了。只是还有一些细节需要考虑。

1、如何表示颜色。这个简单,用整数就可以。其实,用不用颜色表示都可以,只要将每个分组分开即可。这里采用二元组来表示,一个表示颜色,一个表示分好的组。、

2、如何记录分组。可以用一个集合来记录,也就是groups是集合的集合。

3、如何表示图结构?这个比较难,是后面的内容,这里先略过。

由此可得出python的代码:

第四步,测试代码,寻找一些边界例子测试代码的严谨性以及逻辑性。

由于,这里并不是一个完整的项目,而且这个例子比较简单,就简单分析讨论一下,应该注意的几个问题。

其实,大致观察一下,就会发现,上面的算法只能给出一个恰好的解。例如,下面的分组也是一个解

其实,经过分析。对于BA、DC、ED三个顶点,将它们放在任何一个分组都是可以的。因为它们不跟任何一个顶点相连,也就是公认的无害右转弯。对于这个设计具体得看对于冲突概念的定义。

2、再次回顾一下算法的实现跟原来的问题是否相符

原来的问题是怎么分配,各个路线才能不冲突。

而上面的算法给出了一种不冲突的方法,但并不是最优的解。比如:上面的算法中每个分组都顶点都不允许重复,也就是各个分组互不相交。但真正的问题并没有这个要求。无害的右转弯就与各个分组都不冲突,完全可以都分配在各个分组里面。使其得到下面的分配:

这样就会将分组尽可能地扩充,使其经济效率更高(这个分组还可以继续扩充为{DA,DB,BA,DC,ED,AD})。

当然,这个问题还会有其他的一些具体的问题,这里就不讨论了。作者主要是用一个例子来带我们分析了一下,如何将生活中的实际问题,一步一步通过分析设计,最终得到一个完整的正确的效率高的计算机程序。

这么强,能不能让它解决一下难倒无数人的奇葩数学题呢?今天我们就用Python求解几个实际的数学题来了解一下Python的一些基本的算法。如果你刚好入门Python,懂一些Python的基本语法,那么刚好可以了解一下,对你的算法提升可能有一定帮助。本文难度为:入门。所以高手请忽略。

暴力求解是已知最古老的算法之一,在科学应用中有其特殊的优势,尤其是计算机技术的出现,使其解题优势变得更加明显,暴力求解或许是解决问题的算法中最“简单粗暴”的方式了,它是计算机解逻辑类题的基础方法,由于其实现较为简单,效率高,所以算法使用已经非常普遍。

问题1:鸡兔同笼,鸡兔共78只,脚200只,问:鸡和兔各多少只?

典型的鸡兔同笼问题,曾几何时,那是我们小学数学时代的噩梦!而今天,用Python暴力求解完全可以不费吹灰之力计算结果。

 
鸡有56只,兔有22只
 
注:在计算出结果后使用break打断循环,实现短路求值,避免多余的无效计算,可以有效的提升计算效率。

用Python快速求解鸡兔同笼问题

 

问题2:鸡兔同笼,兔比鸡少15只,共有脚282只,问:鸡和兔各多少只?

 
鸡兔同笼问题的第二类。
 
鸡有57只,兔有42只
 

 

问题3:小明用10元钱正好买了20分和50分的邮票共35张,求这两种邮票名买了多少张?

 
鸡兔同笼问题的类似问题。
 
20分邮票25张,50分邮票10张
 

 

问题4:储蓄罐里共2分和5分硬币70枚,小刚数了一下,一共有194分,求两种硬币各有多少枚?

 
 
2分硬币52枚,5分硬币18枚
 

 

问题5:一个运输队包运10000只瓶子,每100只可得运费1元5角,如损坏一只不但不给运费,还要赔偿2角。这个队共得运费146元5角6分,损坏了几只瓶子?

 
最烦这种难以理解,逻辑烧脑的题了,想当年学生时代做这种题的时候可没少挨打。
 if b*),我们将及时更正、删除,谢谢。

我要回帖

更多关于 python经典编程题 的文章

 

随机推荐