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

批处理求1000以内的所有素数

求1000以内的所有素数
最好还要有解释的,新手啊...
砂石下的泉水,掘得越深,泉水会越清吗?

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. :a
  4. set /a num+=1
  5. if %num%==1 goto a
  6. for %%a in (2 3) do if %num%==%%a echo %%a&goto a
  7. if %num%==1000 pause>nul&exit
  8. set /a num2=num-1
  9. for /l %%b in (2 1 %num2%) do (
  10. set /a tp=%num%%%%%b
  11. if !tp!==0 set tp2=a
  12. )
  13. set tp2=&if "%tp2%"=="" echo %num%
  14. goto a
复制代码
论坛标题管理观察员

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (0 2 4 5 6 8) do set "_%%i=a"
  3. echo 1-1000內的素數如下:>素數.txt
  4. for /l %%a in (1,1,1000) do (
  5.      set "str=%%i"
  6.      if not defined _!str:~-1! (
  7.        set /a a=%%a/2+1,num=0
  8.        call :lp %%a
  9.      )
  10. )
  11. start 素數.txt
  12. goto :eof
  13. :lp
  14. for /l %%i in (1,1,%a%) do (
  15.      set /a b=%1/%%i*%%i
  16.      if !b! equ %1 set /a num+=1
  17.      if !num! equ 2 goto :eof
  18. )
  19. if %num% lss 2 echo %1 >>素數.txt
复制代码
***共同提高***

TOP

二樓的代碼效率是個問題,完全可以不要驗證一個數所有的約數,除本身外只要約數大於兩個就可以判斷出不是素數了。
***共同提高***

TOP

楼上的都是低效率

TOP

不是完全模拟,经过了人工处理
测试代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (3 2 1000) do (
  4. set flag=0
  5. for /l %%j in (3 2 37) do (
  6. set /a var=%%i%%%%j
  7. if !var! EQU 0 set /a flag+=1
  8. )
  9. if !flag! LEQ 1 echo %%i
  10. )
  11. pause>nul
复制代码

TOP

稍微修整:
  1. @echo off 2>nul 3>nul
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (3 2 1000) do (
  4. set flag=0
  5. for /l %%j in (3 2 37) do set /a 1/^(%%i%%%%j^) ||set/a flag+=1
  6. if !flag! LEQ 1 echo %%i
  7. )
  8. pause>nul
复制代码
3

评分人数

    • Gin_Q: 厉害!技术 + 1
    • wxcute: 经典,超快阿。 2 >nul 与 1/0|| 用得好。 ...PB + 10 技术 + 1
    • pusofalse:PB + 8

TOP

for /l %%i in (1 3 999) do echo %%i

TOP

大家能不能给点翻译啊?
砂石下的泉水,掘得越深,泉水会越清吗?

TOP

原帖由 youxi01 于 2008-10-31 22:25 发表
稍微修整:@echo off 2>nul 3>nul
setlocal enabledelayedexpansion
for /l %%i in (3 2 1000) do (
        set flag=0
        for /l %%j in (3 2 37) do set /a 1/^(%%i%%%%j^) ||set/a flag+=1
        if !flag! LEQ 1 echo %% ...

体现出兄扎实的数学功底,真是望尘莫及啊!
***共同提高***

TOP

怎么youxi的是从67开始?

TOP

回复 11楼 的帖子

呵呵,那是因为批处理一屏显示不了那么多

如果在运行初期你就按ctrl+c,或者echo到一个文本文件就可以看到全部了

TOP

原帖由 youxi01 于 2008-11-1 16:56 发表
呵呵,那是因为批处理一屏显示不了那么多

如果在运行初期你就按ctrl+c,或者echo到一个文本文件就可以看到全部了

if not "%1"=="more" call "%~0"|more&exit
论坛标题管理观察员

TOP

原帖由 youxi01 于 2008-11-1 16:56 发表
呵呵,那是因为批处理一屏显示不了那么多

如果在运行初期你就按ctrl+c,或者echo到一个文本文件就可以看到全部了

原来如此

TOP

写个用文件的

  1. @echo off
  2. setlocal enableDelayedExpansion
  3. >ss.txt echo 2
  4. for /l %%i in (3 2 1000) do (
  5.  for /f %%j in (ss.txt) do (
  6.   set/a mod=%%i%%%%j
  7.   if !mod! equ 0 set flag=1
  8.  )
  9.  if defined flag (set flag=) else (>>ss.txt echo %%i)
  10. )
  11. type ss.txt
  12. pause
  13. goto :eof
复制代码

TOP

返回列表