Fattorizzatore numeri

« Older   Newer »
  Share  
lOwl
CAT_IMG Posted on 5/7/2012, 16:22     +1   -1




Ciao a tutti!
Ho appena finito di scrivere questo piccolo programma ed ho pensato di postarlo qua per sentire cosa ne pensate.
In pratica divide in fattori primi un numero inserito dall'utente.
Se avete commenti/critiche scrivetelo nei commenti!

Il codice è piuttosto lungo a causa dell'enorme array contenente i numeri primi minori di 10000.
(Nel file .zip sono compresi il Source ed il Compilato)


FrontBack - Security Decompiler Team

SecureFile: QUI


Edited by FrontBack - 24/1/2013, 18:40
 
Top
Doch88
CAT_IMG Posted on 5/7/2012, 17:52     +1   -1




Ci sono metodi più semplici di avere un array con tutti i numeri primi, potresti, per esempio, farli trovare al programma.
 
Top
»Master
CAT_IMG Posted on 5/7/2012, 18:48     +1   -1




bravo, però non c'è bisogno di limitarti a soltanto 10000, puoi averne quanti vuoi (ovvio che se sali troppo il limite li avrai soltanto dopo l'eta dell'universo xD)
ecco qui un script che ho fatto in 3 minuti lol
CODICE
Dim $arr[1]=[2]
ConsoleWrite("Creo una lista con i numeri primi minori di 30000"&@LF)
ConsoleWrite($arr[0]&@LF)
$size=UBound($arr)
For $x=3 To 30000
       For $y=0 To $size-1
               If IsInt($x/$arr[$y]) Then ExitLoop
       Next
       If $y=$size Then
               ReDim $arr[UBound($arr, 1)+1]
               $arr[UBound($arr, 1)-1]=$x
               ConsoleWrite($x&@LF)
               $size=UBound($arr)
       EndIf
Next
 
Top
lOwl
CAT_IMG Posted on 5/7/2012, 19:18     +1   -1




Lo so che ci sono i numeri primi solo fino a 10.000, ma su internet ho trovato la lista fino a lì e non avevo voglia di scrivere un programma che li trovasse.
Stasera o domani ci provo!

CITAZIONE (»Master @ 5/7/2012, 19:48)
bravo, però non c'è bisogno di limitarti a soltanto 10000, puoi averne quanti vuoi (ovvio che se sali troppo il limite li avrai soltanto dopo l'eta dell'universo xD)
ecco qui un script che ho fatto in 3 minuti lol
CODICE
Dim $arr[1]=[2]
ConsoleWrite("Creo una lista con i numeri primi minori di 30000"&@LF)
ConsoleWrite($arr[0]&@LF)
$size=UBound($arr)
For $x=3 To 30000
       For $y=0 To $size-1
               If IsInt($x/$arr[$y]) Then ExitLoop
       Next
       If $y=$size Then
               ReDim $arr[UBound($arr, 1)+1]
               $arr[UBound($arr, 1)-1]=$x
               ConsoleWrite($x&@LF)
               $size=UBound($arr)
       EndIf
Next

Non ho capito bene come funziona il codice che mi hai messo. Così faecendo, non trova solo i numeri dispari?
 
Top
»Master
CAT_IMG Posted on 5/7/2012, 19:20     +1   -1




CITAZIONE (lOwl @ 5/7/2012, 20:18) 
Lo so che ci sono i numeri primi solo fino a 10.000, ma su internet ho trovato la lista fino a lì e non avevo voglia di scrivere un programma che li trovasse.
Stasera o domani ci provo!

CITAZIONE (»Master @ 5/7/2012, 19:48)
bravo, però non c'è bisogno di limitarti a soltanto 10000, puoi averne quanti vuoi (ovvio che se sali troppo il limite li avrai soltanto dopo l'eta dell'universo xD)
ecco qui un script che ho fatto in 3 minuti lol
CODICE
Dim $arr[1]=[2]
ConsoleWrite("Creo una lista con i numeri primi minori di 30000"&@LF)
ConsoleWrite($arr[0]&@LF)
$size=UBound($arr)
For $x=3 To 30000
       For $y=0 To $size-1
               If IsInt($x/$arr[$y]) Then ExitLoop
       Next
       If $y=$size Then
               ReDim $arr[UBound($arr, 1)+1]
               $arr[UBound($arr, 1)-1]=$x
               ConsoleWrite($x&@LF)
               $size=UBound($arr)
       EndIf
Next

Non ho capito bene come funziona il codice che mi hai messo. Così faecendo, non trova solo i numeri dispari?

ovviamente ci sono soltanto numeri dispari, se non lo fossi sarebbero divisibili per due e non sarebbero primi xD
comunque non prova soltanto la divisione per 2, prova la divisione per due e per tutti i altri numeri primi trovati, se non è divisibile per nessuno di loro, esso è primo e viene aggiunto alla lista xd
 
Top
lOwl
CAT_IMG Posted on 5/7/2012, 20:07     +1   +1   -1




CITAZIONE (»Master @ 5/7/2012, 20:20)
CITAZIONE (lOwl @ 5/7/2012, 20:18) 
Lo so che ci sono i numeri primi solo fino a 10.000, ma su internet ho trovato la lista fino a lì e non avevo voglia di scrivere un programma che li trovasse.
Stasera o domani ci provo!

CITAZIONE (»Master @ 5/7/2012, 19:48)
bravo, però non c'è bisogno di limitarti a soltanto 10000, puoi averne quanti vuoi (ovvio che se sali troppo il limite li avrai soltanto dopo l'eta dell'universo xD)
ecco qui un script che ho fatto in 3 minuti lol
CODICE
Dim $arr[1]=[2]
ConsoleWrite("Creo una lista con i numeri primi minori di 30000"&@LF)
ConsoleWrite($arr[0]&@LF)
$size=UBound($arr)
For $x=3 To 30000
       For $y=0 To $size-1
               If IsInt($x/$arr[$y]) Then ExitLoop
       Next
       If $y=$size Then
               ReDim $arr[UBound($arr, 1)+1]
               $arr[UBound($arr, 1)-1]=$x
               ConsoleWrite($x&@LF)
               $size=UBound($arr)
       EndIf
Next

Non ho capito bene come funziona il codice che mi hai messo. Così faecendo, non trova solo i numeri dispari?

ovviamente ci sono soltanto numeri dispari, se non lo fossi sarebbero divisibili per due e non sarebbero primi xD
comunque non prova soltanto la divisione per 2, prova la divisione per due e per tutti i altri numeri primi trovati, se non è divisibile per nessuno di loro, esso è primo e viene aggiunto alla lista xd

Ci ho fatto una figura di m.
L'ho capito solo ora. Non avevo capito come funziona la funzione ReDim... Ora mi è chiaro il funzionamento.
 
Top
lOwl
CAT_IMG Posted on 5/7/2012, 21:13     +1   -1




Ecco con questo codice ho calcolato i primi fino a 100000.
Appena posso rifaccio il calcolo con il computer fisso (millemila volte più potente) per arrivare ad 1000000.

CODICE
#include <Array.au3>
dim $primi[1] = [2]
const $max = 100000

ProgressOn("Numeri primi", "Calcolo numeri primi in corso")
ProgressSet(0)

For $i = 3 to $max
       for $j = 0 to UBound($primi) - 1
               if Mod($i, $primi[$j]) = 0 Then
                       ExitLoop
               Elseif $j = UBound($primi) - 1 Then
                       ReDim $primi[UBound($primi)+1]
                       $primi[UBound($primi)-1] = $i
                       ExitLoop
               EndIf
       Next
       ProgressSet($i/$max*100)
Next

ProgressOff()
_ArrayDisplay($primi)
$file = FileOpen(@WorkingDir & "\primi.txt", 2)

for $i = 0 to UBound($primi) - 1
       FileWrite($file, $primi[$i]&", ")
Next

FileClose($file)


Grazie per l'aiuto.
Nel programma aggiungerò una funzione per calcolare i numeri primi compresi tra due numeri.
 
Top
»Master
CAT_IMG Posted on 5/7/2012, 22:11     +1   -1




ecco, bravo ;)
 
Top
7 replies since 5/7/2012, 16:22   259 views
  Share