主题:[讨论][跟yaozheng的]开个DOSSHELL(批处理)编程讨论区
def
[专家分:3380] 发布于 2005-04-30 20:11:00
看见UNIXSHELLunix&linux开发讨论区都右人喜欢,那么就开革DOS批处理开发讨论区吧!
回复列表 (共5个回复)
沙发
winkill [专家分:310] 发布于 2005-04-10 20:51:00
同意本提案!
板凳
def [专家分:3380] 发布于 2005-04-23 20:54:00
为了支持,特放了一个代码:
:: 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 楼
def [专家分:3380] 发布于 2005-04-23 20:57:00
WillSort:一个批处理专家(With China DOS Union DOS BBS,http://dos.e-stone.cn/dosbbs/),她能出一个真不容易啊[em8]
4 楼
def [专家分:3380] 发布于 2005-04-24 11:39:00
其他请参看[url]http://dos.e-stone.cn/dosbbs/dispbbs.asp?boardid=12&star=1&replyid=54491&id=8905&skin=0&page=1[/url]
5 楼
def [专家分:3380] 发布于 2005-04-30 20:24:00
yaozheng啊
我来回复