[batch] Problema extraño

Iniciado por kraszic, 9 Julio 2008, 23:15 PM

0 Miembros y 1 Visitante están viendo este tema.

kraszic

Buenas, el otro dia me decidi a hacer un programa q saque todos los numeros primos desde el 0 hasta el 10000 o los q quisiera y q aparte hiciera mas cosas.
Para empezar, hice un codigo q instalara todos los numeros del 0 hasta 10000 en un archivo.txt. Todo funciona bien pero cuando llega sobre el valor 300 el programa se cierra misteriosamente.

Lo abri con la cmd y me sale este error:



Este es el codigo del programa:
Código (dos) [Seleccionar]
echo Se instalaran todos los numeros primos hasta 10000.
echo Espere mientras se instalan los numeros.
echo Al final aparecera un mensaje.
echo LISTA DE NUMEROS PRIMOS >primos.txt
echo. >>primos.txt
echo 2 >>primos.txt
echo 3 >>primos.txt

set num=4
:inicio
set num2=1
set /a num=%num%+1
if %num%==10000 goto acaba
:inicio2
set /a num2=%num2%+1

for /f "tokens=1 skip=%num2%" %%a in (primos.txt) do call :func %%a
:func
set cru=%1
set /a pro1=%num%/%cru%
set /a res=%num%-(%cru%*pro1)
if %res%==0 goto inicio
if %cru% GTR %pro1% goto fuera
goto inicio2

:fuera
echo %num% >>primos.txt
goto inicio

:acaba
echo Instalado
pause>nul
exit


Bueno, por si alguien no lo sabe, el procedimiento q he tomado para calcular si un numero es primo, es dividir el numero en cuestion por todos los numeros primos empezando por el 2, cuando el divisor (numero primo) es mayor q el quociente, ese numero es primo.

A ver, si alguien entiende el error y si se puede hacer algo para q no pase esto.

saludos

carlitos.dll

#1
[Modificado] Dejo el code actualizado más abajo.

kraszic

Bueno, al final no se porq me empeñe tanto con lo del for para q cogiera los numeros primos...
Igualmente, si cogemos todos los numeros, el programa funciona bastante rapido, asi q lo dejere asi.

La modificacion q he hecho es en vez de ir de uno en uno, coger un numero impar e ir de dos en dos ya que todos los numeros pares no son primos.

saludos

carlitos.dll

#3
buen dato kraszic, es decir solo el dos es par y es primo, y con el dato que diste se puede hacer el cálculo mucho más rápido. Ahora leí que los que terminan en 5, y son mayores que 5, son múltiplos de 5, así es que no son primos.

Aquí modifiqué el code, para que quedara más rápido.


::CarlitoS.dll
::Graba en archivo numeros primos

@echo off

set /a inicio=2
set /a fin=10000

if %inicio% LEQ 2 (set /a inicio=3 & call :divi 2)
for /l %%n in (%inicio%,2,%fin%) do call :divi %%n
goto :eof

:divi
cls & echo Working . .
set esPrimo=false
set /a divini=1
set /a divfin=%1
if %divfin:~-1%==5 (if %1 GTR 5 (goto :eof))
call :divi2 %1
if %esPrimo%==true (echo %1 >>primos.txt)
goto :eof

:divi2
cls & echo Working . . .
if %esPrimo%==true (goto :eof)
set /a divini +=1
if %divini% GTR %divfin% (goto :eof)
set /a mod=%1-(%1/%divini%*%divini%)
if not %mod%==0 (goto divi2)
if %mod%==0 (if not %1==%divini% (set esPrimo=false) else (set esPrimo=true))
goto :eof