恩,看过了。楼主是不断改变调用函数的参数来达到辗转取余,相当于高级语言中的深层递归了。奇怪,怎么去年写的到现在回帖这么少啊,个人觉得求公约数和公倍数很有代表性啊。说实话,当时在学C语言时一开始就碰到这道题了,也是思考好久才明白了其思想,现在我就写出来请大家一起讨论下吧!
例:a=384,b=216
【法一】
大家都知道最大公约数即为两个数的公约数中最大的那个,既然如此,穷举出两个数中所有的公约数,再找出最大的即可。思想很简单,但只能对付一般的数值,如果对于几十位或上百位的大整数,效率实在不敢恭维。在此就不做进一步介绍了,大家有兴趣可以写下代码。
【法二】辗转取余法(辗转相除法)
1.最大公约数
这种方法最早记载于公元前几百年欧几里得的《几何原本》中,这种方法不需要逐个求两数的约数。具体实现如下(省略号后为余数):
<1> 384/216=1......168
<2> 216/168=1......48
<3> 168/48=3........24
<4> 48/24=2..........0
聪明的你一定发现规律了吧,第一次对两个数取余,第二次用两个数中较小的与求得的余数再做取余运算,这样反复辗转取余,直到余数为0.不知道说清楚了没,大家对照下面表格再理解下。
a b a mod b
384 216 168
216 168 48
168 48 24
48 24 0
求到最后一步a mod b=0,中的b,即24即为最大公约数。为什么是这样就能得到结果呢,请大家参考下面的链接,这里我就不讲了。
http://www.cnblogs.com/erwin/articles/704399.html
2.最小公倍数
关于最小公倍数的求法就简单了,两数相乘a*b,再除以两个数的最大公约数即可,上例中,最小公倍数为384*216/24=3456
现在附上我的代码,请大家一起讨论:- @echo off&setlocal enabledelayedexpansion
- :begin
- echo====================
- set /p num1=第一个数:
- set /p num2=第二个数:
- call :gcd %num1% %num2%
- :gcd
- set a=%1
- set b=%2
- :start
- set /a num=a%%b
- if %num% gtr 0 (
- set /a b=!a!%%!b!
- set /a a=%b%
- goto start
- )else (
- echo 最大公约数:!b!
- set /a sum=%1*%2/!b!
- echo 最小公倍数:!sum!
- goto begin
- )
复制代码 我学批处理没多久,代码可能还可以精简,大家一起讨论,共同学习啊!
[ 本帖最后由 lhjoanna 于 2008-11-7 18:28 编辑 ] |