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

[数值计算] 批处理解决韩信点兵问题如何优化代码?

今有一队人马,每排11人余7,13余7,17正好一个没剩,19余3
求最少有多少人?
1.传统算法是从1到100000做循环,筛选出所求的数,但是这效率不免太低
2.故我把C三n mod (m)的算法用批处理实现
不知道谁有比较好的方法
我只会简单的用批处理,所以有很多冗长的代码,谁顺便帮我修改下。

1.谁要用这个试下电脑性能我也无所谓。。。
我不知道为什么第一反应会写出这个来
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (2431,1,100000) do (
  4. for /l %%j in (2431,1,100000) do (
  5.   for /l %%k in (2431,1,100000) do (
  6.    for /l %%m in (2431,1,100000) do (
  7.     set /a x=11*%%i+7
  8.     set /a y=13*%%j+7
  9.     set /a z=17*%%k
  10.     set /a num=19*%%m+3
  11.     if !x! equ !y! if !y! equ !z! if !z! equ !num! (
  12.      echo !num!
  13.       )
  14.      )
  15.     )
  16.    )
  17.   )
  18.   echo.
  19.   echo 所求的值为 %num%
  20.   echo.
  21.   pause
复制代码
2.我的电脑上运行大约需要7.30s
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (143,1,46189) do (
  4. set /a x=%%i%%11-7
  5. set /a y=%%i%%13-7
  6. set /a z=%%i%%17
  7. set /a num=%%i%%19-3
  8. if !x! equ !y! if !y! equ !z! if !z! equ !num! if !num! equ 0 (
  9. echo the num is %%i
  10. goto :end
  11.   )
  12. )
  13. :end
  14. pause
复制代码
3.谁能帮我加个计算时间的代码进去,要是可以把两个合成一个也行
第一个bat
  1. @echo off
  2. echo     韩信点兵
  3. set i=11
  4. set j=7
  5. set k=13
  6. set l=7
  7. call 4.bat
  8. set k=17
  9. set l=0
  10. call 4.bat
  11. set k=19
  12. set l=3
  13. call 4.bat
  14. echo the num is %j%
  15. pause
复制代码
第二个bat,我是管他叫4.bat,自己看着办吧
  1. ::过程
  2. set /a num=%i%*%k%
  3. ::两被除数的公倍数
  4. if %i% lss %k% goto change
  5. ::比较大小
  6. goto begin
  7. :change
  8. set temp=%i%
  9. set i=%k%
  10. set k=%temp%
  11. set temp=%j%
  12. set j=%l%
  13. set l=%temp%
  14. ::C三j mod(i);C三l mod(k) C代表所求的数,"三"符号
  15. :begin
  16. set /a n=%i%*%l%  
  17. ::iC三n mod(num)
  18. set /a m=%j%*%k%  
  19. ::kC三m mod(num)
  20. :loop
  21. set /a r=%i%%%%k%
  22. ::余数
  23. set /a t=(%i%-%r%)/%k%
  24. ::商i=t*k+r
  25. set /a temp=%n%-%t%*%m%
  26. ::n=t*m+temp
  27. set i=%k%
  28. set k=%r%
  29. set n=%m%
  30. set m=%temp%
  31. if %r% neq 1 goto loop
  32. ::判断C三temp mod(num)是否成立
  33. :out
  34. if %temp% lss 0 (
  35. set /a temp+=%num%
  36. goto out
  37. )
  38. :end
  39. if %temp% gtr %num% (
  40. set /a temp-=%num%
  41. goto end
  42. )
  43. set i=%num%
  44. set j=%temp%
复制代码

[ 本帖最后由 yishanyishui 于 2009-10-26 20:33 编辑 ]

楼主在顶楼对问题的描述应该是少了个条件,要用批解出来,还应规定下士兵在多少人数以内,以上代码是假定士兵在170000人以内:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,10000) do (
  3.     set /a num=%%a*17,num1=num%%11,num2=num%%13,num3=num%%19
  4.     if !num1!!num2!!num3! equ 773 set "str=!str! !num!人"
  5. )
  6. echo 可能的士兵人数分别为:%str:~1%
  7. pause>nul
复制代码

[ 本帖最后由 batman 于 2009-10-25 22:16 编辑 ]
1

评分人数

    • Seter: !num1!!num2!!num3! equ 773 好!PB + 2
***共同提高***

TOP

BATMAN强啊,我来个笨办法
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=18
  3. set a=11
  4. set m=13
  5. set t13=7
  6. set p13=17
  7. set t17=0
  8. set p17=19
  9. set t19=3
  10. :l
  11. set/ak=n%%m-!t%m%!
  12. if %k%==0 (
  13. set/aa*=m
  14. if not defined p!m! echo !n!&pause&exit
  15. set m=!p%m%!
  16. )
  17. set/an+=a
  18. goto l
复制代码

[ 本帖最后由 Seter 于 2009-10-26 19:26 编辑 ]

TOP

题目已修正

楼上两位我都看不懂。。。
能不能够稍微写下思路

TOP

返回列表