
[此贴子已经被作者于2004-12-6 11:17:44编辑过]
CODE: [Copy to clipboard]───────────────── 版务记录 ─────────────────:: Prime.bat - Generate a serial prime number
:: Dirk van Deun - Will Sort Modified 2004/11/18
::
:: 改进: 将isprime和divided函数并入主函数以及其他一些风格上的改进
:: 效果: 函数,变量和代码均减少, 速度继续提升; 测试运行时间约 1.6秒
@echo off
if [%1]==[$] goto %2
if [%1]==[] %comspec% /e:5000 /c %0 $ init
del ~prime.bat
goto end
:: 初始化: 产生素数2, 将它存为第一个素数, 设置循环起始值
:init
echo I I
set prime-num=I
set %prime-num%=I I
set prime-in=I
:: 对3~n的奇数 %prime-in% 与已产生的所有素数由小到大循环相除
:: 若全部未整除则显示此整数, 否则递增 %prime-in% 后继续循环
:runloop
set prime-in=I I %prime-in%
set divisor-no=I
:divideloop
echo set divisor=%%%divisor-no%%%>~prime.bat
call ~prime.bat
call %0 $ loopminus %prime-in%
if "%min-out%"=="" goto runloop
if "%divisor-no%"=="%prime-num%" goto isprime
set divisor-no=I%divisor-no%
goto divideloop
:isprime
echo %prime-in%
set prime-num=I%prime-num%
if "%prime-num%"=="IIIIIIIIII" goto end
set %prime-num%=%prime-in%
goto runloop
:: 对传入的 %dividend%(被除数) %divisor%(除数) 循环相减
:: 若不足相减 (%2!=I) 则返回下溢错, 否则直接返回空
:loopminus
for %%n in (%divisor%) do shift
if not [%3]==[] goto loopminus
set min-out=
if [%2]==[] set min-out=underflow
goto end
:end
rimeLoop
ivideCODE: [Copy to clipboard]───────────────── 版务记录 ─────────────────:: 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
| 欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) | Powered by Discuz! 2.5 |