谈起古代数学,总会想起古希腊欧几里得的名著《几何原本》。而实际上,中国的《周髀算经》《九章算术》《缉古算经》等同样经典,尤其是《九章算术》,更以其算法实用性闻名世界。
中国古代数学的一些发展成果可谓惊艳,足以让人感到自豪:二进制的思想起源(周易)早于西方2000年; 几何思想起源(战国《墨经》)早于西方100多年; 勾股定理(西周人商高)早于西方550年; 幻方(《论语》《书经》)早于西方600年; 分数运算及小数使用(公元一世纪《九章算术》)领先世界500年,方程算法(《九章算术》)领先世界600年; 祖冲之的圆周率保持精确记录约千年……
项目说明: 《丘建算经》约著于公元5世纪,现传本有92问,比较突出的成就有:最大公约数与最小公倍数的计算、各种等差数列问题的解决、某些不定方程问题求解等。百鸡问题是《邱建算经》中的一个世界著名的不定方程问题,它给出了由三个未知量的两个方程组成的不定方程组的解。百鸡问题是:“今有鸡翁一,值钱五; 鸡母一,值钱三; 鸡雏三,值钱一。凡百钱,买鸡百只,问鸡翁、母、雏各几何?” 译文:“5个钱可买一只公鸡,3个钱可买一只母鸡,1个钱可买三只小鸡,今用100个钱,正好买了100只鸡。问其中公鸡、母鸡、小鸡各几只?”。
同样不要使用方程式,使用C#程序来解决该问题。
提示:使用循环嵌套。
项目实现步骤:
(1) 创建一个控制台应用。
(2) 在“代码编辑”窗口中,找到Main()方法,在该方法内编写代码如下:
(3) 单击“启动”按钮或按F5键,弹出控制台窗口并显示4种结果,如图2-2所示。
■ 图2-2控制台窗口显示结果
项目小结:
(1) 解题思路依然是分步拆解处理。
第一步,先穷举公鸡数、母鸡数和小鸡数的所有可能组合,这类操作应该考虑用for语句嵌套; 第二步,进行满足条件判断,即可得到结果。
(2) 利用各种流程控制语句的特点来解决问题。
① 使用for循环语句可以穷举各种可能性。
本案例项目中,可以使用三重for语句穷举公鸡数、母鸡数和小鸡数的所有可能组合:
②使用 if 语句进行判断。
以上将if判断放入最内层for循环中,就可获得所需答案。
(3) 解题有时需要考虑效率上的优劣。
用for三重循环解题时,内部条件判断操作的次数有 21×32×101次,即67872次。是否可以优化?显然是可以的。实际上小鸡的数量可表示为100-cook-hen,此时少了一个最内层for循环语句,条件判断操作次数下降到了21×32次,即672次,约为原来的1%。
(4) 注意表达式中数据类型的选择。
案例项目中有代码(100-cook-hen)/3.0,可否考虑改为(100-cook-hen)/3?测试会发现有7种组合结果,显然是有问题的。
分析其原因:除号左边为整数,若除以整数3,结果为整数,会造成不符合要求的数值“混入”。例如,公鸡数7、母鸡数13和小鸡数80。因为80/3结果为26,所以在满足百鸡条件情况下,也“满足”了百钱要求(7×5+13×3+80/3=35+39+26=100)。若采用除以小数3.0,则可规避该问题。