[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 批处理求最小共倍数和最大公约数

  1. ::原理:展转相除法
  2. ::code by youxi01@bbs.bathome.net 2007-10-24
  3. @echo off & setlocal enabledelayedexpansion
  4. if "%1"=="" goto :help
  5. call :loop %1 %2
  6. echo.
  7. echo %1和%2之间的最大公约数为:!deno! 最小公倍数为:!multi!
  8. pause>nul
  9. :loop %1 %2
  10. set /a var=%1 %% %2,deno=%2
  11. if !var! neq 0 call :loop %2 !var!
  12. set /a multi=%1*%2/!deno!
  13. goto :eof
  14. :help
  15. echo.&echo ==========================求最大公约数和最小公倍数=================
  16. echo [使用格式]    %~0 %1 %2
  17. echo [使用示例]    %~0 12 42
  18. echo ============================--------=================================
  19. cmd /k
复制代码

本帖最后由 czjt1234 于 2022-11-20 15:22 编辑

回复 8# yyz219


    俗称不明觉厉

就是原理不懂,就烦这个位移

QQ 20147578

TOP

可读性≈0
真的好拽!!!

TOP

虽然不怎么看得明白,但是,觉得很强大
我是小白,希望老师多多帮助

TOP

本帖最后由 老刘1号 于 2022-7-1 19:13 编辑

一万年后学了数理逻辑+位运算+数字电路的我又回来了

可读性≈0
  1. @echo off
  2. set /a a=%random%,b=%random%
  3. rem swap a & b to makes a >= b if nessary
  4. set /a "c=((a-b)>>31)+1"
  5. set /a "d=c*a+(1-c)*b"
  6. set /a "e=(1-c)*a+c*b"
  7. rem echo %a% %b% %c% %d% %e%
  8. set /a "a=d,b=e"
  9. rem get greatest common divisor of a & b into a
  10. :g0
  11. set /a "c=a%%b,a=b,b=c,gend=!c"
  12. rem echo %a% %b%
  13. goto g%gend%
  14. :g1
  15. echo %d% %e% -^> %a%
  16. pause
复制代码
论坛这个万年屏蔽词…幸好我又看了一眼

TOP

朋友拿C语言的题考我…还讲了辗转相除…没想到这个坑已经被填了……
  1. echo off&cls
  2. set /p num1=输入第一个数:
  3. set /p num2=输入第二个数:
  4. if %num1% LSS %num2% ^
  5. set num1=%num2% & set num2=%num1%
  6. :LOOP
  7. set TMP=
  8. set /a tmp=%num1%%%num2%
  9. if %tmp% neq 0 (
  10. set /a num1=num2
  11. set /a num2=tmp
  12. ) else (
  13. call :end %num2%
  14. exit
  15. )
  16. goto loop
  17. :end
  18. echo 它们的最大公约数是%1。
  19. pause
复制代码
1

评分人数

TOP

这是第一个批处理程序?

TOP

恩,看过了。楼主是不断改变调用函数的参数来达到辗转取余,相当于高级语言中的深层递归了。奇怪,怎么去年写的到现在回帖这么少啊,个人觉得求公约数和公倍数很有代表性啊。说实话,当时在学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

对对!!!以后大家要多测试一下楼主们的代码哦 提出建议
讨论 让论坛的帖子热起来!

TOP

创办作品,值得支持。。
不过这个论坛的朋友们,看帖不回贴的现象太严重了,直接没有人气。
没有听说吗?灌水也是一种美德。这样人气才旺盛。。。。。。。。。。
建议管理员增加 hide  命令窗口。回复才可以看到。。。。。。

TOP

返回列表