@echo %db% off&setlocal enabledelayedexpansion
set t1=%time% %=开始计时=%
set ss=5
%=这里设置5是忽略了2和3,所以这里要加上=%
for /l %%a in (1,2,1000) do (
%=for里面设置步长(step)为2是为了剔除偶数,这样效率可能要高些=%
set /a num=%%a
set /a tc3=!num! "%%" 3
if !tc3! neq 0 (
set /a n=!num!-1
call :sss !n!
if [!flag!]==[bbbb] (echo !num!&set /a ss+=!num!)
)
)
echo 1—1000 中所有的素数加起来的和为: [ %ss% ]%=显示结果=%
set t2=%time%%=计时结束=%
echo/
echo 开始时间:%t1%
echo 结束时间:%t2%
echo/
pause&exit/b0
::::::::::::::::::Sub Function::::::::::::::::::::
:sss
set a=
for /l %%a in (2,1,%1) do (
set /a a=!num! "%%" %%a
if !a! equ 0 (
set flag=aaaa
goto :eof
) else (
set flag=bbbb)
)
Originally posted by vkill at 2007-1-23 22:18: 回去想想 [ Last edited by vkill on 2007-1-24 at 11:20 AM ]帖一个网上的解释吧:来自sjweb.hhit.edu.cn/article/show ...
素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任 何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12 =6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以 外,不能表示为其它任何两个整数的乘积,所以13是一个素数。
@echo off&setlocal enabledelayedexpansion
set t1=%time% %=开始计时=%
echo 2
echo 3
set/a sum=5
for /l %%a in (5,2,1000) do (
set/a temp=%%a %% 3
if !temp! NEQ 0 (
set/a temp=%%a-1
set flag=1
for /l %%b in (3 2 !temp!) do (
set/a num=%%a %% %%b
if !num! EQU 0 set flag=0)) else set flag=0
if !flag! EQU 1 echo %%a & set/a sum+=%%a)
set t2=%time%%=计时结束=%
echo/
echo 开始时间:%t1%
echo 结束时间:%t2%
echo 1000以内的素数和为:%sum%
pause>nul
@echo off&setlocal enabledelayedexpansion
set t1=%time%
set sum=5
for /l %%i in (5,2,2000) do (
set /a limit=%%i / 2
set isPrime=true
for /l %%j in (3,2,!limit!) do (
set /a mod=%%i %% %%j
if "!mod!"=="0" set isPrime=false
)
if "!isPrime!"=="true" (echo %%i&set /a sum+=%%i)
)
echo 1—1000 中所有的素数加起来的和为: [ %sum% ]
echo.
echo 开始时间:%t1%
echo 结束时间:%time%
echo.
pause
@echo off
setlocal enabledelayedexpansion
set t1=%time%
set sum=5
echo 2 >prime.txt
echo 3 >>prime.txt
for /l %%i in (5,2,10000) do (
set /a limit=%%i / 2
call :isPrime %%i
if "!isPrime!"=="true" (
echo %%i
set /a sum+=%%i
)
)
echo 1—10000 中所有的素数加起来的和为: [ %sum% ]%=显示结果=%
echo.
echo 开始时间:%t1%
echo 结束时间:%time%
echo.
pause
goto :eof
:isPrime
set isPrime=false
for /f %%j in (prime.txt) do (
set /a mod=%1 %% %%j
if !mod! equ 0 goto :eof
set /a prd=%%j * %%j
if !prd! geq %1 (
echo %1 >>prime.txt
set isPrime=true
goto :eof
)
)
@echo off
setlocal enabledelayedexpansion
set t=%time%
set s=2 3 5 7 %--1不是素数--%
for /l %%l in (1,1,99) do ( %--从十位开始计算,所以等下要加上2,3,5,7--%
for %%i in (1 3 7 9) do ( %--素数的个位数只能是1,3,7,9--%
set/a m=%%l%%i"%%"3
if !m! neq 0 (
set flag=1
for %%m in (!s!) do ( %--这里用来取余的数是被取余数之前的素数集--% %--ps:我也不清楚这样算对不对--%
set/a b=%%l%%i"%%"%%m
if !b! equ 0 set flag=0
)
) else (set flag=0)
if !flag! equ 1 (
echo %%l%%i
set/a sum+=%%l%%i
set s=!s! %%l%%i
)
)
)
set/a sum=%sum%+2+3+5+7
echo 开始于[%t%]
echo 结束于[%time%]
echo 1000以内的素数和为[%sum%]
@echo off&setlocal enabledelayedexpansion
set t1=%time% %=开始计时=%
set sum_=5
echo.>Result.txt
echo 2
echo 3
for /l %%a in (5,2,100) do (
set/a temp=%%a-1
set flag=1
for /l %%b in (3 2 !temp!) do (
set/a num=%%a %% %%b
if !num! EQU 0 set flag=0)
if !flag! EQU 1 (
echo %%a
echo %%a>>Result.txt
set/a sum_+=%%a))
for /l %%a in (101 2 10000) do (
set/a mod=%%a %% 3
if !mod! Neq 0 (
set flag=1
for /f %%i in (Result.txt) do (
set/a mod=%%a %% %%i
if !mod! EQU 0 set flag=0)
if !flag! EQU 1 echo %%a & set/a sum+=%%a))
set/a sum=!sum!+!sum_!
set t2=%time%%=计时结束=%
echo/
echo 开始时间:%t1%
echo 结束时间:%t2%
echo 1000以内的素数和为:%sum%
pause>nul
@echo off
setlocal enabledelayedexpansion
set t=%time%
set sqrt=31
set n=1000
for /l %%i in (1,1,%n%) do set num%%i=%%i
for /l %%i in (2,1,%sqrt%) do (
set /a i=%%i+1
if not "!num%%i!"=="0" (
for /l %%j in (!i!,1,%n%) do (
if not "!num%%j!"=="0" (
set /a x=!num%%j! %% %%i
if "!x!"=="0" set num%%j=0
)
)
)
)
for /l %%i in (2,1,%n%) do (
if not "!num%%i!"=="0" (
set /p =!num%%i!<nul
set /a s+=%%i
)
)
echo.
echo.
echo 1-%n%的素数和=%s%
echo 起始时间=%t%
echo 结束时间=%time%
pause
附件 1:prime.rar (2007-1-25 12:21, 4.25 K, 下载附件所需积分 1点 ,下载次数: 10)
@echo off&setlocal enabledelayedexpansion
set t1=%time% %=开始计时=%
set sum=17&set n=3&set n1=3&set n2=5&set n3=7
set/p a= 2 3 5 7 <nul
for /l %%a in (9 2 99) do (
set/a a=%%a%%3,b=%%a%%5,c=%%a%%7
if not !a!==0 if not !b!==0 if not !c!==0 set/p= %%a<nul&set/a sum+=%%a&set/a n+=1&&set n!n!=%%a)
for /l %%a in (101 2 9999) do (
for /l %%b in (1,1,%n%) do (
set/a a=%%a%%n%%b
if !a!==0 set b=1)
if not !b!==1 set/p= %%a<nul&set/a sum+=%%a
set b=0)
set t2=%time%%=计时结束=%
echo/
echo 开始时间:%t1%
echo 结束时间:%t2%
echo 10000以内的素数和为:%sum%
pause
@echo off
setlocal enabledelayedexpansion
set t1=%time% %=开始计时=%
set /a s=17, n=3, n1=3, n2=5, n3=7
for /l %%a in (9,2,99) do (
set/a p=%%a%%3 * %%a%%5 * %%a%%7
if !p! neq 0 (
set/a s+=%%a, n+=1
set n!n!=%%a
)
)
for /l %%a in (101,2,9999) do (
set p=1
for /l %%b in (1,1,%n%) do (
if !p! neq 0 set/a "p=(%%a%%n%%b)*p/p"
)
if !p! neq 0 set/a s+=%%a
)
set t2=%time%%=计时结束=%
echo/
echo 开始时间:%t1%
echo 结束时间:%t2%
echo 10000以内的素数和为:%s%
pause
素数相除法: 先用10以内的素数除以100以内有各数, 得到1-100的素数, 再用1-100内的素数除以101-10000以内的数, 得到1-10000以内的素数.
下面是两种算法对求1-11000以内素数和的结果, 素数相除法因为没有采用更高位的素数除10000以后的数, 把一些非素数也判断成了素数. 素数和也更大.
筛法: 1-11000范围内素数和为:的6848586
素数相除法: 1-11000范围内素数和为:6890606
素数判定算法
(当且仅当n为素数时,最终输出数才为素数)
(当且仅当n为素数时,最终输出数才为素数)
Input: integer n>1
1. if ( n is the form of a^b, b>1) output Composite;
2. r = 2;
3. while (r)
4. if (gcd(n,r)1) output Composite;
5. if (r is the prime)
6. let q be the largest factor of r-1;
7. if (q>= 4 * (r^(1/2)) * log(n)) and (n^((r-1)/q))) mod r 1)
8. break;
9. r:=r+1;
10. {
11. for a := 1 to 2*(r^(1/2))*log(n);
12.if ((x-a)^n mod n(x^n-a)) and ((x-a)^n mod (x^r -1)(x^n-a))output Composite;
13.output Prime;