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

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

[复制链接]
发表于 2008-11-3 12:16:35 | 显示全部楼层

品评一下 7 楼代码

大优点:
以下两句使得速度大提
@echo off 2>nul 3>nul
set /a 1/^(%%i%%%%j^)||

小缺点:
LEQ 1,应改成 LEQ 0 或 LSS 1 吧,呵呵
11 楼所提问题不是因为显示不下吧,XP CMD 默认缓冲 300 行,而千以内的素数有百来个完全可以显示得下

改后也还有问题
当 %%i 与 %%j 相同时会使 set /a 1/^(%%i%%%%j^) 除数为 0,得 flag=1
所以 3-37 中的素数全会被剔除,加个判断就好了 if %%j lss %%i 或 if %%j neq %%i

开头加个 echo 2 ,2也是素数
是不是有挖墙脚之嫌了,闪
发表于 2009-3-2 22:25:43 | 显示全部楼层

回复 6楼 的帖子

末位是5的也是素数?youxi01的代码有问题。995都出来了。

[ 本帖最后由 myzwd 于 2009-3-2 23:52 编辑 ]
发表于 2009-3-12 14:18:52 | 显示全部楼层
素数包括数字2,2是唯一的属于偶数的素数。
发表于 2009-5-8 11:23:52 | 显示全部楼层

回复 3楼 的帖子

3楼代码,刚好漏掉素数 2
发表于 2009-5-8 14:28:10 | 显示全部楼层

我也来一个

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo 1
  4. echo 2
  5. set/a num=2
  6. for /l %%i in (3 2 1000) do (
  7. call :test %%i
  8. if !flag!==1 echo %%i&set/a num+=1
  9. )
  10. echo 1~1000内共有素数 %num% 个。
  11. pause>nul &goto :eof

  12. :test
  13. set /a flag=1
  14. set /a b=%1/2
  15. set /a count=0
  16. for /l %%a in (1 1 !b!) do (
  17.   set /a yushu=%1 %% %%a
  18.   if !yushu! equ 0 set /a count=!count!+1
  19.   if !count! gtr 1 (set /a flag=0 & goto :eof)
  20. )
复制代码

评分

参与人数 1PB +3 收起 理由
wxcute + 3 不错,不错。

查看全部评分

发表于 2009-5-8 14:50:04 | 显示全部楼层
原帖由 wxcute 于 2008-11-3 10:48 发表
@echo off
setlocal enableDelayedExpansion
>ss.txt echo 2
for /l %%i in (3 2 1000) do (
 for /f %%j in (ss.txt) do (
  set/a mod=%%i%%%%j
  if !mod! equ 0 set flag=1
 )
 if defined flag  ...


冰疼的代码,比上楼我的代码效率高多了,对冰疼的代码进行修改,不再写入文件。
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. set str=2&set/a num=1
  4. echo 2
  5. for /l %%i in (3 2 1000) do (
  6. for %%j in (!str!) do (
  7.  set/a mod=%%i%%%%j
  8.  if !mod! equ 0 set flag=1
  9. )
  10. if defined flag (set flag=) else (echo %%i&set str=!str! %%i&set/a num+=1)
  11. )
  12. echo 1000以内的素数共有 %num% 个。
  13. pause>nul
  14. goto :eof
复制代码

[ 本帖最后由 sjzong 于 2009-5-8 14:57 编辑 ]

评分

参与人数 1PB +2 收起 理由
wxcute + 2 改得好,有个问题就是数量再多的话可能会超 ...

查看全部评分

发表于 2011-1-7 16:45:51 | 显示全部楼层
增加了一个判断 提高效率
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. set/p x=请输入需求 多大数字内的质数
  4. set str=2&set/a num=1
  5. echo 2
  6. for /l %%i in (3 2 !x!) do (
  7.         for %%j in (!str!) do (
  8.             set/a mod=%%i%%%%j
  9.           if !mod! equ 0 set flag=1
  10.         )
  11.        if defined flag (set flag=) else (
  12.                                     echo %%i
  13.                                     set/a n=%%i*%%i
  14.                                     set/a num+=1
  15.                                     if !n! lss !x! set str=!str! %%i
  16.                                     )
  17. )
  18. echo !x!以内的素数共有 %num% 个。
  19. pause
复制代码

[ 本帖最后由 skuny 于 2011-1-13 19:31 编辑 ]
发表于 2011-1-12 20:04:45 | 显示全部楼层

回复 22楼 的帖子

22楼改得真好,效率大大提高。
发表于 2011-1-12 20:38:35 | 显示全部楼层

俺也贴一个

  1. @echo off
  2. setlocal EnableExtensions
  3. setlocal EnableDelayedExpansion

  4. REM 时间:20:36 2011-01-12
  5. REM 功能:求1000以内的质数.效率一般。

  6. set /a n=1
  7. set /a m=1
  8. set /a p%n%=2
  9. echo 2
  10. set "flag="
  11. for /L %%a in (3,2,1000) do (
  12.         call :PRIME %%a !m! flag
  13.         if "!flag!"=="TRUE" (
  14.                 echo %%a
  15.                 set /a n+=1
  16.                 set /a temp=%%a*%%a
  17.                 if !temp! lss 1000 (
  18.                         set /a m+=1
  19.                         set p!m!=%%a
  20.                 )
  21.         )
  22. )
  23. echo 1000以内共有%n%个质数
  24. pause
  25. goto :EOF       
  26.        
  27. :PRIME
  28. for /l %%a in (1,1,!m!) do (
  29.         set /a yu=%1%%!p%%a!
  30.         if "!yu!"=="0" (
  31.                 set "%3=FALSE"
  32.                 goto :EOF
  33.         )
  34. )
  35. set "%3=TRUE"
复制代码
发表于 2011-5-15 09:23:56 | 显示全部楼层
本帖最后由 techon 于 2011-5-15 09:28 编辑
@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 %%i
)


算法到可以 就是判断有误

拿个典型的数字 如 699
发表于 2011-5-29 10:51:25 | 显示全部楼层
讲究效率的话,应该用Sieve of Eratosthenes(埃拉托斯特尼筛法),但是代码比较长

  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION

  3. REM Author: Demon
  4. REM Date: 2011/5/29
  5. REM Website: http://demon.tw
  6. REM Algorithm: Sieve of Eratosthenes
  7. REM Reference: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

  8. SET /A limit = 1000
  9. SET /A prime = 2

  10. CALL :Init
  11. CALL :SievePrime
  12. CALL :Display
  13. PAUSE & GOTO :EOF

  14. :Display
  15.     FOR /L %%i IN (2, 1, %limit%) DO (
  16.         SET t=!arr[%%i]!
  17.         IF !t! NEQ 0 ECHO !t!
  18.     )
  19. GOTO :EOF

  20. :Init
  21.     FOR /L %%i IN (1, 1, %limit%) DO SET arr[%%i]=%%i
  22. GOTO :EOF

  23. :SievePrime
  24.     SET /A pow = prime * prime
  25.     IF %pow% LSS %limit% (
  26.         SET /A n = prime * 2
  27.         FOR /L %%i IN (!n!, %prime%, %limit%) DO SET arr[%%i]=0
  28.         CALL :NextPrime
  29.         GOTO :SievePrime
  30.     )
  31. GOTO :EOF

  32. :NextPrime
  33.     SET /A prime += 1
  34.     FOR /L %%i IN (%prime%, 1, %limit%) DO (
  35.         IF !arr[%%i]! NEQ 0 SET /A prime = %%i & GOTO :EOF
  36.     )
  37. GOTO :EOF
复制代码
发表于 2012-10-21 10:41:20 | 显示全部楼层
发一个素数查找的
有一定缺陷,理论上数字可以是2^31以内,但只能到13000左右。
原因是set命令只能有8K字符长度,超过8K的话bat设置的set命令全部清除,也就造成后面代码出错。
这个效率应该可以!
  1. @echo off&setlocal ENABLEDELAYEDEXPANSION
  2. if %1.==. (set i=100) else set /a i=%1||exit/b
  3. set time_0=!time!
  4. set "p=2 3 5 7 11 13 17 19"
  5. for %%a in (!p!) do (if %%a gtr !i! (exit/b) else echo %%a)
  6. set i_0=!i:~0,-1!
  7. set "p=3 7 11 13 17 19"
  8. for /l %%a in (2,1,!i_0!) do (
  9.     for %%b in (1 3 7 9) do (
  10.         set p_0=!p!
  11.         set /a x_%%b=0
  12.         for %%c in (!p_0!) do (
  13.             if !x_%%b! equ 0 (
  14.                set /a p_1=%%a%%b %% %%c
  15.                if !p_1! equ 0 set /a x_%%b=1,p_0=1
  16.             )
  17.         )
  18.         if %%a%%b gtr !i! (echo 开始时间:!time_0!&echo 结束时间:!time!&exit/b) else (
  19.            if !x_%%b! equ 0 set "p=!p! %%a%%b"&echo %%a%%b
  20.         )
  21.     )
  22. )
  23. exit/b
复制代码
发表于 2012-10-21 18:46:41 | 显示全部楼层
费马小定理 概率算法,秒杀~
发表于 2019-12-14 11:13:27 | 显示全部楼层
回复 7# youxi01


    2也是质数(素数)(素数又称质数,一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数,也就是素数;否则称为合数。)前辈的算法真的厉害!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:31 , Processed in 0.023489 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表