2014-01-27 9 views
0

Это код:Batch Неисправного Prime Number Generator

@echo off 
title 

setlocal enabledelayedexpansion 
set a=2 
set b=3 
echo 2 
goto c 
:b 
set /a b+=2 
:c 
:a 
for %%G in (!a!) do (set /a d=%%G*%%G 
if !d! gtr !b! call :d 
set /a c=b%%%%G 
if !c!==0 call :b) 
:d 
set a=!a! !b! 
echo !b! 
goto b 

exit 

Предел это 509 и когда я убираю, если заявление по тестовому значению в квадрате, если укорачивает возможные результаты вместо того, чтобы сделать код более эффективный. Без указанного оператора if код вычисляется до 800, но вместе с ним он ограничен 509. Что я могу сделать, чтобы обойти это ограничение?

Я подправил сценарий здесь и там, и перекодировать его работать лучше:

@echo off 
title 

setlocal enabledelayedexpansion 
set a=3 
set b=3 
echo 2 
echo 3 
:a 
set /a b+=2 
for %%G in (!a!) do (set /a d=%%G*%%G 
if !d! gtr !b! goto b 
set /a c=b%%%%G 
if !c!==0 goto a) 
:b 
set a=!a! !b! 
echo !b! 
goto a 

ответ

1

Вы код несколько странно. Пара деталей об этом:

  • Я не понимаю, почему вы используете команду call. Ваш код никогда не выполнить exit, поэтому вы можете устранить exit в конце и выполненный код в точности такой же.
  • Вместо этого вы можете использовать gotocall. Таким образом, нет никаких ограничений в результатах (за исключением 32-бит ограничивает максимальное количество)

EDIT: Ответить на комментарий

Ну, я просто сказал, что программный код, который выполнить call команд много раз без одного exit, конечно, не обычный, но это только мое мнение!

Код ниже Ваш первый же код с только call с заменены goto с и улучшенным форматированием, как удаление неиспользуемых линий: a: этикетки и последний exit.

@echo off 
title 

setlocal enabledelayedexpansion 
set a=2 
set b=3 
echo 2 
goto c 

:b 
set /a b+=2 

:c 
for %%G in (!a!) do (
    set /a d=%%G*%%G 
    if !d! gtr !b! goto :d 
    set /a c=b %% %%G 
    if !c!==0 goto :b 
) 

:d 
set a=!a! !b! 
echo !b! 
goto b 

Я запускаю эту программу и получаю бесконечный цикл выходных результатов, поэтому через некоторое время я остановил ее. Таковы последние результаты:

251117 
251143 
251149 
251159 
251171 
251177 
251179 
251191 
251197 
251201 
251203 
251219 
251221 

Как я уже говорил ранее, предел этих результатов является максимальное количество 32-бит управляется set /A командой.

+0

Ваш ответ несколько странный в том, что он совершенно неконструктивен, выход остался после того, как я создал схему из другого скрипта, и goto почти не имеет разницы, он заканчивает сценарий в 700-х годах. – user3093536

+0

@ user3093536: Прошу прощения, если мой ответ вас беспокоит; это не было моим намерением. См. Редактирование в моем ответе, пожалуйста ... – Aacini

1
@ECHO OFF 
setlocal enabledelayedexpansion 
set a=2 
set b=3 
echo 2 
goto c 
:d 
set a=%a% %b% 
echo %b% 
IF "%a:~8100,1%"=="" GOTO b 
echo %a% 
echo at limit 
GOTO :EOF 
:b 
set /a b+=2 
:c 
:a 
for %%G in (%a%) do (
set /a d=%%G*%%G 
if !d! lss 0 ECHO done&ECHO !a!&GOTO :eof 
if !d! gtr !b! GOTO d 
set /a c=b%%%%G 
if !c!==0 goto b 
) 
GOTO d 

Вашей главная проблема заключается в том, что вы CALL вашей главной рутине в вашей основной программе - либо прямой вызов B или позвонив D, который просто идет к B, так что это эффективно то же самое. Существует ограничение на количество вложенных циклов, которые вы можете иметь, и вы достигли этого предела.

С помощью этой процедуры, достигающей :d, записывается новое простое число в списке a, а если число не является простым, :b, чтобы выбрать новый номер для проверки.

Весь блок от FOR до его закрытия ) анализируется в одно время, и есть Liit к длине этой линии «» (около 8190 символов).Я просто использовал 8100 в качестве предела для длины a, чтобы остановить партию чисто.

Обратите внимание, что `! Var! ~ Требуется только после изменения переменной окружения в цикле.

Проверка того, что !d! меньше нуля, не будет достигнута (поскольку вы достигнете предела длины строки), но гарантирует, что если значение кандидата превышает ~ 2^31, тогда процедура должна прекратиться.

Если вы хотите расширить это, вам нужно будет записать значения другим способом - возможно, массивом. Затем вы можете запустить общий предел размера для среды, и вам нужно будет начать сохранять результаты в файл.

+0

Возможно ли использовать текстовый файл с пробелом в каждой строке в цикле for? Как в: для %% G в (! File!)? – user3093536

+0

На самом деле, я, похоже, исправил это. Он работает гладко и превзошел мои ожидания! Он рассчитал более 3000 за 4 секунды, поэтому я обновляю свой ответ. – user3093536