回 帖 发 新 帖 刷新版面

主题:[讨论][跟yaozheng的]开个DOSSHELL(批处理)编程讨论区

看见UNIXSHELLunix&linux开发讨论区都右人喜欢,那么就开革DOS批处理开发讨论区吧!

回复列表 (共5个回复)

沙发

同意本提案!

板凳

为了支持,特放了一个代码:
:: Prime.bat - Generate a serial prime number
:: Dirk van Deun - Will Sort Modified 2004/11/18
::
:: Contents of reference:
:: A system of batch files that generates prime numbers in "prisoners
:: notation".  (It's rather sloooooooow.)  END.BAT is really an empty
:: file, by the way.
::   http://student.vub.ac.be/~dvandeun
::
:: 素数堆垒程序修改版: 一个产生素数的程序, 因为其输出形似堆垒而名
::
:: 源代码正如上文所说,非常的慢,所以不得不做了一些修改
::
:: 主要的修改:
::   1 将源码的所有函数并入主程序中, 加套控制性外壳
::   2 将主循环起始值改为3, 步进值改为2, 也即只判断大于2的奇数
::   3 判断素数时, 不再除以从2到n-1的所有数, 改为从2到n-1的所有素数
::   4 将除法函数的递归相减算法改为循环相减算法
::   5 将素数判断循环和除法循环并入主循环
::   6 变量名, 标签名, 注释, 缩进等代码风格上的改动
::
:: 环境变量说明:
::   iTest:测试数, iPrime:素数序号
::   divisor:用以判断素数的除数, iDivisor:除数序号
::   less: 除法中不足除的标志
::
@echo off
if [%1]==[$] goto %2
if [%1]==[] %comspec% /e:4096 /c %0 $ init
del ~prime.bat
goto end

:: 初始化: 产生素数2, 将它存为第一个素数, 设置循环起始值为3
:init
set iTest=I
set iPrime=I
set %iPrime%=I I
echo I I

:: 对3~n的奇数 %iTest% 与已产生的所有素数由小到大循环相除
:: 若全部未整除则显示此整数, 否则递增 %iTest% 后继续循环
:MainLoop
set iTest=I I %iTest%
set iDivisor=I
    :PrimeLoop
    echo set divisor=%%%iDivisor%%%>~prime.bat
    call ~prime.bat
    call %0 $ Divide %iTest%
    if "%less%"=="" goto MainLoop
    if "%iDivisor%"=="%iPrime%" goto IsPrime
    set iDivisor=I%iDivisor%
    goto PrimeLoop
:IsPrime
echo %iTest%
set iPrime=I%iPrime%
if "%iPrime%"=="IIIIIIIIIIII" goto end
set %iPrime%=%iTest%
goto MainLoop

:: 将传入的被除数 %iTest% 除以(循环减)除数 %divisor%
:: 若不足除 (无法整除) 则返回不足信号 less, 否则直接返回
:Divide
for %%n in (%divisor%) do shift
if not [%3]==[] goto Divide
set less=
if [%2]==[] set less=true
goto end

:end


另一个:
:: Solve.bat - 验证哥德巴赫猜想的程序
:: Will Sort - 2004/11/18
::
:: 从素数堆垒程序变化而来
:: 环境变量说明:
::   iTest:测试数, iPrime:素数序号
::   divisor:用以判断素数的除数, iDivisor:除数序号
::   Factor1&Factor2: 偶数的两个分解因子, iFactor1&iFicator2:因子序号
::   less: 除法中不足除的标志, diff: 减法中有差值的标志
::
@echo off
if [%1]==[$] goto %2
if [%1]==[] %comspec% /e:4096 /c %0 $ init
del ~Solve.bat
goto end

:: 初始化: 产生素数2, 将它存为第一个素数, 设置循环起始值为3
:init
set iTest=I I
set iPrime=I
set %iPrime%=I I

:: 对3~n的奇数 %iTest% 与已产生的所有素数由小到大循环相除
:: 若全部未整除则将 %iTest% 存入素数 %iPrime%, 否则跳至 Solve
:: 对3~n的偶数 %iTest% 分解为已产生的两个素数之和
:: 若恰好分解则显示此偶数和两个分解因子, 否则继续循环 MainLoop
:MainLoop
:Prime - 判断奇数是否为素数
set iTest=I %iTest%
set iDivisor=I
    :PrimeLoop
    echo set divisor=%%%iDivisor%%%>~Solve.bat
    call ~Solve.bat
    call %0 $ Divide %iTest%
    if "%less%"=="" goto Solve
    if "%iDivisor%"=="%iPrime%" goto IsPrime
    set iDivisor=I%iDivisor%
    goto PrimeLoop
:IsPrime
set iPrime=I%iPrime%
set %iPrime%=%iTest%
:Solve - 将偶数分解为素数之和
set iTest=I %iTest%
set iFactor1=
    :SolveLoop
    set iFactor1=I%iFactor1%
    if "%iFactor1%"=="I%iPrime%" goto SolveLoop
    set iFactor2=%iFactor1%
        :SolveSubLoop
        if "%iFactor2%"=="I%iPrime%" goto SolveLoop
        echo set Factor1=%%%iFactor1%%%> ~Solve.bat
        echo set Factor2=%%%iFactor2%%%>>~Solve.bat
        call ~Solve.bat
        call %0 $ Minus %iTest%
        if "%diff%"=="" goto IsSolve
        set iFactor2=I%iFactor2%
        goto SolveSubLoop
:IsSolve
echo %iTest%
echo %Factor1% + %Factor2%
if "%iPrime%"=="IIIIIIIII" goto end
goto MainLoop

:: 将传入的被除数 %iTest% 除以(循环减)除数 %divisor%
:: 若不足除 (无法整除) 则返回不足信号 less, 否则直接返回
:Divide
for %%n in (%divisor%) do shift
if not [%3]==[] goto Divide
set less=
if [%2]==[] set less=true
goto end

:: 将传入的被减数 %iTest% 减去减数 %Factor1% 和 %Factor2%
:: 若有差值 (无法分解) 则返回相差信号 diff, 否则直接返回
:Minus
for %%n in (%Factor1%) do shift
for %%n in (%Factor2%) do shift
set diff=
if "%2"=="" set diff=true
if not "%3"=="" set diff=true
goto end

:end

3 楼

WillSort:一个批处理专家(With China DOS Union DOS BBS,http://dos.e-stone.cn/dosbbs/),她能出一个真不容易啊[em8]

4 楼

其他请参看[url]http://dos.e-stone.cn/dosbbs/dispbbs.asp?boardid=12&star=1&replyid=54491&id=8905&skin=0&page=1[/url]

5 楼

yaozheng啊

我来回复

您尚未登录,请登录后再回复。点此登录或注册