【程序13】 题目:一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少? 1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。 【程序16】 题目:输出9*9口诀。 思考一下,如果不想出现重复的乘积,比如不再出现3x1=3,而是直接从3x3=9开始,应该对上述程序做如何改动。 答案
将for (int j = 1; j <= 9; j++)改为“j=i”。如何j从i开始,循环到9,就可以避免出现3x1=3了。 【程序21】 题目:求1+2!+3!+...+20!的和 上述程序其实可以简化,在计算3的阶乘的时候,2的阶乘其实已经算过了,只不过在2的阶乘上面再乘以3就得到了3的阶乘。同理,只要我把第i个数的阶乘存下来,到第i+1个数的时候,只需要把之前的阶乘乘上i+1即可得到新的阶乘。 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析: 可以无视上述题目,其实兔子的规律为数列1,1,2,3,5,8,13,21.... 这就是斐波那契数列,从第三个数开始,每个数都是前面两个数的和,也就是说a1 = 1,a2 = 1, a(i) = a(i-1) + a(a-2)。 所以,本题可以简化为,打印出第1到第20个斐波那契数列。 仔细思考上述程序是如何运行的。可以参考这篇文章:http://blog.csdn.net/u010397369/article/details/47751695 总的来说,在运算第i个数的时候,需要去计算第i-1和i-2个数,而计算第i-1个数的时候又需要计算i-2和i-3个数,以此类推,如同下图所示: 所以,其实如果能够把之前算过的斐波那契数列存在一个数组里面,那么计算新的斐波那契数的时候就很简单了,只需要找到之前的两个数,然后加起来即可。于是简化的代码如下。 思考一下: 为什么第二段程序计算斐波那契数列,比第一段程序快?第一段程序为什么耽误了时间,进行了不必要的计算? 另外,代码中使用到了tempArray[i - 2],是否需要担心i-2是负数,从而出错,因为无法访问数列的第-1个数。 【额外题目】 有1到100号共100个柜子。有一个人决定从第一个柜子开始,先把所有号码能被1整除的柜子打开/关闭(如果柜子是打开的,就要关闭柜子;如果柜子是关闭的,就要打开柜子),然后再从第一个柜子开始,把所有号码能被2整除的柜子打开/关闭,以此类推,进行100轮如此的操作,最后把所有号码能被100整除的柜子打开/关闭。 假设所有的柜子一开始都是关闭的,请问最后,哪些号码的柜子是处于打开的状态? 程序分析:用一个布尔类型来代表一个柜子的打开或关闭状态,用两重循环模拟这个过程。
0 Comments
Leave a Reply. |
更多有趣的文章档案库
November 2018
分类 |