[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
恩,看过了。楼主是不断改变调用函数的参数来达到辗转取余,相当于高级语言中的深层递归了。奇怪,怎么去年写的到现在回帖这么少啊,个人觉得求公约数和公倍数很有代表性啊。说实话,当时在学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

现在附上我的代码,请大家一起讨论:
  1. @echo off&setlocal enabledelayedexpansion
  2. :begin
  3. echo====================
  4. set /p num1=第一个数:
  5. set /p num2=第二个数:
  6. call :gcd %num1% %num2%
  7. :gcd
  8. set a=%1
  9. set b=%2
  10. :start
  11. set /a num=a%%b
  12. if %num% gtr 0 (
  13.      set /a b=!a!%%!b!
  14.      set /a a=%b%
  15.      goto start
  16. )else (
  17.      echo 最大公约数:!b!
  18.      set /a sum=%1*%2/!b!
  19.      echo 最小公倍数:!sum!
  20.      goto begin
  21. )
复制代码
我学批处理没多久,代码可能还可以精简,大家一起讨论,共同学习啊!

[ 本帖最后由 lhjoanna 于 2008-11-7 18:28 编辑 ]
2

评分人数

TOP

返回列表