今有一队人马,每排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 编辑 ] |