标题: [数值计算] 批处理解决韩信点兵问题如何优化代码? [打印本页]
作者: yishanyishui 时间: 2009-10-25 10:38 标题: 批处理解决韩信点兵问题如何优化代码?
今有一队人马,每排11人余7,13余7,17正好一个没剩,19余3
求最少有多少人?
1.传统算法是从1到100000做循环,筛选出所求的数,但是这效率不免太低
2.故我把C三n mod (m)的算法用批处理实现
不知道谁有比较好的方法
我只会简单的用批处理,所以有很多冗长的代码,谁顺便帮我修改下。
1.谁要用这个试下电脑性能我也无所谓。。。
我不知道为什么第一反应会写出这个来- @echo off
- setlocal enabledelayedexpansion
- for /l %%i in (2431,1,100000) do (
- for /l %%j in (2431,1,100000) do (
- for /l %%k in (2431,1,100000) do (
- for /l %%m in (2431,1,100000) do (
- set /a x=11*%%i+7
- set /a y=13*%%j+7
- set /a z=17*%%k
- set /a num=19*%%m+3
- if !x! equ !y! if !y! equ !z! if !z! equ !num! (
- echo !num!
- )
- )
- )
- )
- )
- echo.
- echo 所求的值为 %num%
- echo.
- pause
复制代码
2.我的电脑上运行大约需要7.30s- @echo off
- setlocal enabledelayedexpansion
- for /l %%i in (143,1,46189) do (
- set /a x=%%i%%11-7
- set /a y=%%i%%13-7
- set /a z=%%i%%17
- set /a num=%%i%%19-3
- if !x! equ !y! if !y! equ !z! if !z! equ !num! if !num! equ 0 (
- echo the num is %%i
- goto :end
- )
- )
- :end
- pause
复制代码
3.谁能帮我加个计算时间的代码进去,要是可以把两个合成一个也行
第一个bat- @echo off
- echo 韩信点兵
- set i=11
- set j=7
- set k=13
- set l=7
- call 4.bat
- set k=17
- set l=0
- call 4.bat
- set k=19
- set l=3
- call 4.bat
-
- echo the num is %j%
- pause
复制代码
第二个bat,我是管他叫4.bat,自己看着办吧- ::过程
- set /a num=%i%*%k%
- ::两被除数的公倍数
- if %i% lss %k% goto change
- ::比较大小
- goto begin
-
- :change
- set temp=%i%
- set i=%k%
- set k=%temp%
- set temp=%j%
- set j=%l%
- set l=%temp%
- ::C三j mod(i);C三l mod(k) C代表所求的数,"三"符号
-
- :begin
- set /a n=%i%*%l%
- ::iC三n mod(num)
- set /a m=%j%*%k%
- ::kC三m mod(num)
-
- :loop
- set /a r=%i%%%%k%
- ::余数
- set /a t=(%i%-%r%)/%k%
- ::商i=t*k+r
- set /a temp=%n%-%t%*%m%
- ::n=t*m+temp
-
- set i=%k%
- set k=%r%
- set n=%m%
- set m=%temp%
-
- if %r% neq 1 goto loop
- ::判断C三temp mod(num)是否成立
-
- :out
- if %temp% lss 0 (
- set /a temp+=%num%
- goto out
- )
-
- :end
- if %temp% gtr %num% (
- set /a temp-=%num%
- goto end
- )
-
- set i=%num%
- set j=%temp%
复制代码
[ 本帖最后由 yishanyishui 于 2009-10-26 20:33 编辑 ]
作者: batman 时间: 2009-10-25 22:11
楼主在顶楼对问题的描述应该是少了个条件,要用批解出来,还应规定下士兵在多少人数以内,以上代码是假定士兵在170000人以内:- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1,1,10000) do (
- set /a num=%%a*17,num1=num%%11,num2=num%%13,num3=num%%19
- if !num1!!num2!!num3! equ 773 set "str=!str! !num!人"
- )
- echo 可能的士兵人数分别为:%str:~1%
- pause>nul
复制代码
[ 本帖最后由 batman 于 2009-10-25 22:16 编辑 ]
作者: Seter 时间: 2009-10-26 19:24
BATMAN强啊,我来个笨办法- @echo off&setlocal enabledelayedexpansion
- set n=18
- set a=11
- set m=13
- set t13=7
- set p13=17
- set t17=0
- set p17=19
- set t19=3
- :l
- set/ak=n%%m-!t%m%!
- if %k%==0 (
- set/aa*=m
- if not defined p!m! echo !n!&pause&exit
- set m=!p%m%!
- )
- set/an+=a
- goto l
复制代码
[ 本帖最后由 Seter 于 2009-10-26 19:26 编辑 ]
作者: yishanyishui 时间: 2009-10-26 20:35
题目已修正
楼上两位我都看不懂。。。
能不能够稍微写下思路
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |