[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
效率不高,先发了:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p a=请输入一个大于6的偶数:
  3. for /l %%a in (2,1,%a%) do set /a b=%%a/2+1&call :lp %%a
  4. set "str=#2#%str%"
  5. echo 1-%a%中所有的素数为:%str:#=%
  6. for %%a in (%str%) do (
  7.     set "var=!str: %%a=!"
  8.     for %%b in (!var!) do (
  9.         set "d=%%a"&set "d=!d:#=!"
  10.         set "e=%%b"&set "e=!e:#=!"
  11.         set /a num=d+e
  12.         if %a% equ !num! echo %a%=!d!+!e!&goto next
  13.     )
  14. )
  15. :next
  16. pause>nul&goto :eof
  17. :lp
  18. for /l %%a in (2,1,%b%) do (
  19.     set /a c=%1%%%%a
  20.     if !c! equ 0 goto :eof
  21. )
  22. set str=%str% #%1#
复制代码
思路:
    先获取2-输入的偶数中的所有素数,然后再对素数进行两两相加,如和等于输入数就输出结果。

[ 本帖最后由 batman 于 2009-4-24 22:41 编辑 ]
***共同提高***

TOP

来个高效点的:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p a=请输入一个大于6的偶数:
  3. for /l %%a in (3,1,%a%) do (
  4.     set /a b=a-%%a,n=0&call :lp %%a !b!
  5.     if !n! equ 2 echo %a%=%%a+!b!&goto next
  6. )
  7. :next
  8. pause>nul&goto :eof
  9. :lp
  10. set /a c=%1/2+1
  11. for /l %%a in (2,1,%c%) do (
  12.     set /a d=%1%%%%a
  13.     if !d! equ 0 goto :eof
  14. )
  15. set /a n+=1
  16. if "%2" neq "" shift&goto lp
复制代码
***共同提高***

TOP

修改我楼上的,用位运算取得数的平方根近似值,以减少循环次数:
  1. @echo off&setlocal enabledelayedexpansion
  2. rem write by batman on 2009-4-25 15:51 of bbs.bathome.net
  3. set /p a=请输入一个大于6的偶数:
  4. set "t=%time:~,-3%"
  5. for /l %%a in (3,2,%a%) do (
  6.     set /a b=a-%%a,n=0&call :lp %%a !b!
  7.     if !n! equ 2 (
  8.        echo 开始时间:%t% 结束时间:!time:~,-3!
  9.        echo %a%=%%a+!b!&goto next
  10.     )
  11. )
  12. :next
  13. pause>nul&goto :eof
  14. :lp
  15. for /l %%a in (1,1,30) do (
  16.      set /a "num=2<<%%a",yu=%%a%%2
  17.      if %%a equ 30 set /a "num=~num"
  18.      if !num! geq %1 set /a "c=2<<%%a/2+yu"&goto loop
  19. )
  20. :loop
  21. for /l %%a in (3,2,%c%) do (
  22.      if %%a neq %1 set /a d=%1%%%%a
  23.      if !d! equ 0 goto :eof
  24. )
  25. set /a n+=1
  26. if "%2" neq "" shift&goto lp
复制代码
2

评分人数

    • lxzzr: 高,我的代码都不敢贴出来了PB + 10 技术 + 1
    • 随风: 确实高效。PB + 20 技术 + 1
***共同提高***

TOP

应该我楼上的效率到了极限了。。。。如此我认为,再怎么高效地构建素数表,都只是做了无用功。

[ 本帖最后由 batman 于 2009-4-25 17:55 编辑 ]
***共同提高***

TOP

回lhjoanna版主,可能是我的言语没有注意,还请兄弟原谅。但对于超大数来讲,要构建素数表,永远都会存在效率问题,这就
是我的本意。
***共同提高***

TOP

思路:利用牛顿迭代法快速求出数的平方根近似值,从而最大程度上减少循环次数,算法如下:
    首先我们设要求的这个数为a,它的平方根为x;然后我们一开始令x=a;然后我们进入一个
循环,不断的令x=(x+a/x)/2,就是令x等于 x和a/x的平均值,这样迭代了10次左右就可以得到a
的平方根x的近似值。
因此将本人12楼的代码再次提速如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. rem write by batman on 2009-4-26 3:20 of bbs.bathome.net
  3. set /p a=请输入一个大于6的偶数:
  4. set "t=%time:~,-3%"
  5. for /l %%a in (3,2,%a%) do (
  6.     set /a b=a-%%a,n=0,c=a&call :lp %%a !b!
  7.     if !n! equ 2 (
  8.        echo 开始时间:%t% 结束时间:!time:~,-3!
  9.        echo %a%=%%a+!b!&goto next
  10.     )
  11. )
  12. :next
  13. pause>nul&goto :eof
  14. :lp
  15. for /l %%a in (1,1,10) do set /a c=(c+a/c)/2
  16. for /l %%a in (3,2,%c%) do (
  17.      if %%a neq %1 set /a d=%1%%%%a
  18.      if !d! equ 0 goto :eof
  19. )
  20. set /a n+=1
  21. if "%2" neq "" shift&goto lp
复制代码

[ 本帖最后由 batman 于 2009-4-26 03:29 编辑 ]
1

评分人数

***共同提高***

TOP

返回列表