文档介绍:5、 设计一个算法判断一个字符串是否是回文,并写出代码。
"A man a plan a canal panama"是回文。
6、 定义函数,给出三个参数,从字符串inputstring中的下标indexOfChar开始返回 noOfChar个字符。要求找出尽
可能多的错误情形
7、 编一段代码,求两个int的最大公约数
8、 给出一段C+ +代码(关于构建器和虚析构器的调用问题),要求(1)其输出,(2)
说明 virtual destructor
的作用(role)
9、 英文阅读理解。
写一个程序,要求功能:求出用1, 2, 5这三个数不同个数组合的和为100的组合个数。 如:100个1是一个组合,5个1加19个5是一个组合。。。。请用C+ +语言写。 答案:最容易想到的算法是:
设x是1的个数,y是2的个数,z是5的个数,number是组合数注意到0< = x< = 1 00, 0v = yv = 50, 0v = z=20,所以可以编
程为:
number= 0;
for (x= 0; x< = 1 00; x+ +)
for (y= 0; y< = 50; y+ +)
for (z= 0; z< = 20; z+ +)
if ((x+2*y+5*z) = = 100)
number+ + ;
cout< v number< < endl;
上面这个程序一共要循环100*50*20次,效率实在是太低了事实上,这个题目是一道明 显的数学问题,而不是单纯
的编程问题。我的解法如下:
因为 x+ 2y+ 5z= 1 00
所以 x+2y=100-5z,且zv = 20 x< = 100 y< = 50
所以(x+2y)v = 100,且(x+ 5z)是偶数
对z作循环,求x的可能值如下:
z= 0, x= 1 00, 98, 96, ... 0
z= 1, x= 95, 93, ..., 1
z= 2, x= 90, 88, ..., 0
z= 3, x= 85, 83, ..., 1
z= 4, x= 80, 78, ..., 0 z= 1 9, x= 5, 3, 1 z= 20, x= 0
因此,组合总数为100以内的偶数+95以内的奇数+90以内的偶数+...+ 5以内的奇数+ 1, 即为:
(51 + 48)+(46+43)+(41 + 38)+(36+33)+(31 + 28)+(26+23) + (21 + 18)+(16+ 13 )+(11 + 8)+(6+3)+1
某个偶数m以内的偶数个数(包括0)可以表不为m/2+1 = (m + 2)/2
某个奇数m以内的奇数个数也可以表示为(m + 2)/2
所以,求总的组合次数可以编程为:
number= 0;
for (int m= 0;m< = 1 00;m + = 5)
(
number+ = (m + 2)/2;
}
cout< < number< < endl;
这个程序,只需要循环21次,两个变量,就可以得到答案,比上面的那个程序高效了许多
倍----只是因为作了 一些简单的数学分析
这再一次证明了:计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问 题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种 种限制条件下的最优算法。而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了 事一一这不是一个专业的研发人员的行为。
那么,那种最容易想到的算法就完全没有用吗?不,这种算法正好可以用来验证新算法 的正确性,在调试阶段,这非常有用。在很多大公司,例如微软,都采用了这种方法:在调 试阶段,对一些重要的需要好的算法来实现的程序,而这种好的算法又比较复杂时,同时用 容易想到的算法来验证这段程序,如果两种算法得出的结果不一致(而最容易想到的算法保 证是正确的),那么说明优化的算法出了问题,需要修改。
可以举例表示为:
#ifdef DEBUG
int simple();
# end if
int optimize();
in a function:
(
result= optimize();
ASSERT(result= = sim ple());
}
这样,在调试阶段,如果简单算法和优化算法的结果不一致,就会打出断言。同时,在程
序的发布版本,却不会包含笨重的simple()函数。一任何大型工程软件都需要预先设计 良
好的调试手段,而这里提到的就是一种有用的方法。
一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一 起,给出一个age,
在些链表中删除学生年龄等
于a