C#实战 | 求解《丘建算经》百鸡问题-LMLPHP

谈起古代数学,总会想起古希腊欧几里得的名著《几何原本》。而实际上,中国的《周髀算经》《九章算术》《缉古算经》等同样经典,尤其是《九章算术》,更以其算法实用性闻名世界。

中国古代数学的一些发展成果可谓惊艳,足以让人感到自豪:二进制的思想起源(周易)早于西方2000年;  几何思想起源(战国《墨经》)早于西方100多年;  勾股定理(西周人商高)早于西方550年;  幻方(《论语》《书经》)早于西方600年;  分数运算及小数使用(公元一世纪《九章算术》)领先世界500年,方程算法(《九章算术》)领先世界600年;  祖冲之的圆周率保持精确记录约千年……

01、项目二:求解《丘建算经》百鸡问题

项目说明: 《丘建算经》约著于公元5世纪,现传本有92问,比较突出的成就有:最大公约数与最小公倍数的计算、各种等差数列问题的解决、某些不定方程问题求解等。百鸡问题是《邱建算经》中的一个世界著名的不定方程问题,它给出了由三个未知量的两个方程组成的不定方程组的解。百鸡问题是:“今有鸡翁一,值钱五;  鸡母一,值钱三;  鸡雏三,值钱一。凡百钱,买鸡百只,问鸡翁、母、雏各几何?” 译文:“5个钱可买一只公鸡,3个钱可买一只母鸡,1个钱可买三只小鸡,今用100个钱,正好买了100只鸡。问其中公鸡、母鸡、小鸡各几只?”。

同样不要使用方程式,使用C#程序来解决该问题。

提示:使用循环嵌套。

项目实现步骤:

(1) 创建一个控制台应用。

(2) 在“代码编辑”窗口中,找到Main()方法,在该方法内编写代码如下:

C#实战 | 求解《丘建算经》百鸡问题-LMLPHP

 (3) 单击“启动”按钮或按F5键,弹出控制台窗口并显示4种结果,如图2-2所示。

C#实战 | 求解《丘建算经》百鸡问题-LMLPHP

■ 图2-2控制台窗口显示结果

项目小结:

(1) 解题思路依然是分步拆解处理。

第一步,先穷举公鸡数、母鸡数和小鸡数的所有可能组合,这类操作应该考虑用for语句嵌套;  第二步,进行满足条件判断,即可得到结果。

(2) 利用各种流程控制语句的特点来解决问题。

① 使用for循环语句可以穷举各种可能性。

本案例项目中,可以使用三重for语句穷举公鸡数、母鸡数和小鸡数的所有可能组合:

C#实战 | 求解《丘建算经》百鸡问题-LMLPHP

 ②使用 if 语句进行判断。

C#实战 | 求解《丘建算经》百鸡问题-LMLPHP

以上将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,则可规避该问题。

 

07-20 19:14