今偶然在论坛上遇到一面试题,虽然简单,但在各种解法中还是有很多值得借鉴的地方。本文目的在于锻炼思维,汲取一些好的思想。总结一下就是,首先根据问题设计数学模型,从而找到合适的算法;在代码书写方面要学会活用:布尔运算的返回值、||,&&逻辑运算、条件表达式、%求余运算、/除法运算等,从而可以使代码更加简洁。(wcdj 2010-3-10)
题目如下:
只允许使用一个循环,先输出1至10内的奇数,然后输出其中的偶数,结果应该是这样的:
1
3
5
7
9
2
4
6
8
来源:http://topic.csdn.net/u/20081114/18/ad521288-2901-4868-8430-77a0e01ae746.html?27095
第一种想法 :利用循环直接先输出奇数再输出偶数。
关键点:用i控制循环次数,用j计算所要求的数字。
第二种想法 :对第一种想法的改进,利用循环直接先输出奇数再输出偶数。
关键点:用i计算所要求的数字,构造一个数学中的函数:
f(x)=2x-1, x<=5
f(x)=2(x-5), x>5
或者:
上述方法更简洁点的方式为:(利用||和&&运算符的“短路原理”)
类似的思路,将遍历范围扩大一倍,即,2N
基于上个方法的改进:
利用数学上的求余运算,消除上述方法的判断:
再补充一种不用判断的方法,纯用算法实现:
类似上述的:
利用布尔运算,也可以不用判断:
还有一种简单的方法,利用条件表达式:
由上联想,将条件表达式和数学函数一起用:
第三种想法 :利用循环分别将奇数和偶数存在数组的相应位置中。
关键点:对数组下标的计算。
第四种想法 :设计一个类,在构造函数中打印奇数,在循环中打印偶数。
关键点:对类的设计。
一些奇特的方法
[1]
原理:
con表示控制台,输入指的是键盘,输出指的是显示器;
当然可以换成别的: 换成 prn 就会输出到打印机;换成 abc.txt 就输出到文件 abc.txt 了。
上述代码修改如下:
[2]