Board logo

标题: [数值计算] [已解决]批处理怎么判断素数? [打印本页]

作者: abcdshenji    时间: 2011-3-15 16:26     标题: [已解决]批处理怎么判断素数?

本帖最后由 abcdshenji 于 2011-3-20 03:03 编辑

【程序12】
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
      则表明此数不是素数,反之是素数。

随风大哥是这样写的:
  1. @echo off&setlocal EnableDelayedExpansion
  2. for /l %%a in (101 1 200) do (
  3.   set /a n=%%a-1&set "flag="
  4.   for /l %%b in (2 1 !n!) do (
  5.     set /a m=%%a%%%%b
  6.      if !m! equ 0 set flag=a
  7.   )
  8.   if not defined flag echo 素数 %%a
  9. )
  10. echo\&pause
复制代码
youxi01大哥这样写:
  1. @echo off&setlocal EnableDelayedExpansion
  2. for /l %%a in (101 2 200) do (
  3.   set "flag="
  4.   for /l %%b in (3 2 15) do (
  5.     set /a m=%%a %% %%b
  6.      if !m! equ 0 set flag=A
  7.   )
  8.   if not defined flag echo 素数 %%a
  9. )
  10. echo\&pause
复制代码
第一个例子平方根为什么是%%a-1?第二个例子又为什么在(3 2 15)范围循环?
作者: wc726842270    时间: 2011-3-15 19:45

1。平方根在哪里?
2。15的平方>200>14的平方。偶数被过滤了。所以从3开始,步长为2。此种方法属于特殊方法
作者: caruko    时间: 2011-3-15 22:12

记得网上有个判断素数的正则表达式,
虽然findstr不支持分组捕获,但也是可以应用到BAT中的。
作者: caruko    时间: 2011-3-15 22:27

一种方法吧,不见得速度快。
  1. @echo off&setlocal EnableDelayedExpansion
  2. set "th=1"&set /p=请输入一个数:
  3. for /l %%i in (1,1,!p!) do (
  4.   set "str=!str!1"
  5. )
  6. rem 也可以加上先判断是否偶数。
  7. for /l %%i in (3,2,!p!) do (
  8.     set "th=!th!11"
  9.     for /f %%j in ("!th!") do (
  10.         if "!str:%%j=!"=="" set "flag=非素"&goto :end
  11.     )
  12. )
  13. :end
  14. if defined flag (
  15.   echo 非素数
  16. ) else (
  17.   echo 素数
  18. )
复制代码

作者: batman    时间: 2011-3-16 10:43

请楼主参考此贴:
http://www.bathome.net/thread-4310-1-1.html
作者: CrLf    时间: 2011-3-16 13:38

用一个数除去所有小于他的素数,凡是不能被整除的必为素数
作者: CrLf    时间: 2011-3-16 13:43

  1. @echo off&setlocal enabledelayedexpansion >素数.tmp 3>素数.tmp
  2. echo 2
  3. for /l %%a in (3 2 200) do (
  4.    for /f %%b in (素数.tmp) do set /a "test=1/(%%a%%%%b)"||set tmp=%%a
  5.    if %%a neq !tmp! echo %%a
  6. ) 2>nul
  7. type>con 素数.tmp
  8. pause
复制代码

[ 本帖最后由 zm900612 于 2011-3-16 14:10 编辑 ]
作者: abcdshenji    时间: 2011-3-16 15:41     标题: 回复 2楼 的帖子

1、set /a n=%%a-1帮忙解释下为什么是%%a-1?
2、那为什么前面%%a的步长是2不是1?
作者: abcdshenji    时间: 2011-3-16 15:51     标题: 回复 7楼 的帖子

大哥你这段我看不懂啊。。能详细解释下吗
作者: wc726842270    时间: 2011-3-16 17:28

1,是代码看不明白,还是思路不明白
2,如果是思路,那只能说明你的数学没学好了
奇数*奇数=奇数
奇数*偶数=偶数
偶数*偶数=偶数
除了2以外的偶数都是合数(主要是指正整数),而合数至少要有3个约数,自身还有1就是其中之2。约数是不可能超过自身的。所以就是这样了。
在学校里,我只是个不喜欢上劲的学生,也只能说到这样了
作者: abcdshenji    时间: 2011-3-16 17:42     标题: 回复 10楼 的帖子

汗一个。。。小弟不只数学不好语文也不好。。你说的这些不知道跟我问的问题有什么必然联系。。越迷糊了。。唉
作者: CrLf    时间: 2011-3-16 23:19

11楼对素数的定义了解吗?如果了解,可以把所有的合数当成分子来看,素数就是原子,只有原子才不是由多个原子组成的。如果你说化学也不好,那我没话说了...




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2