,
umber是组合数注意到0x100,0y50,0z20,所以可以编程为:
umber0forx0x100xfory0y50yforz0z20zifx2y5z100
umbercout
umbere
dl上面这个程序一共要循环1005020次,效率实在是太低了事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。我的解法如下:因为x2y5z100所以x2y1005z,且z20x100y50所以x2y100,且x5z是偶数对z作循环,求x的可能值如下:
z0x10098960
fz1x95931z2x90880z3x85831z4x80780z19x531z20x0
因此,组合总数为100以内的偶数95以内的奇数90以内的偶数5以内的奇数1,即为:51484643413836333128262321181613118631某个偶数m以内的偶数个数(包括0)可以表示为m21m22某个奇数m以内的奇数个数也可以表示为m22所以,求总的组合次数可以编程为:
umber0fori
tm0m100m5
umberm22cout
umbere
dl这个程序只需要循环21次两个变量,就可以得到答案比上面的那个程序高效了许多倍只是因为作了一些简单的数学分析
这再一次证明了:计算机程序数据结构算法,而且算法是程序的灵魂,对任何工程问题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种种限制条件下的最优算法。而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了事这不是一个专业的研发人员的行为。那么,那种最容易想到的算法就完全没有用吗?不,这种算法正好可以用来验证新算法的正确性,在调试阶段,这非常有用。在很多大公司,例如微软,都采用了这种方法:在调试阶段,对一些重要的需要好的算法来实现的程序,而这种好的算法又比较复杂时,同时用容易想到的算法来验证这段程序,如果两种算法得出的结果不一致(而最容易想到的算法保证是正确的),那么说明优化的算法出了问题,需要修改。可以举例表示为:
fifdefDEBUGi
tsimplee
difi
toptimizei
afu
ctio
resultoptimizeASSERTresultsimple这样在调试阶段如果简单算法和优化算法的结果不一致就会打出断言。同时,在程序的发布版本,却不会包含笨重的simple函数。任何大型工程软件都需要预先设计良好的调试手段,而这里提到的就是一种有用的方法。一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起,给出一个age在些链表中删除学生年龄等于age的学生信息。i
clude