/ / Pole v nepárne poradí - ruby, algoritmus, prvočísla, prvofaktoring, faktorizácia

Pole v zvláštnom poradí - rubín, algoritmus, primes, prime factoring, faktorizácia

Napísal som to, aby som našiel prvú faktorizáciu čísla num, Poskytuje správne odpovede (napríklad 2, 3, 2, 3, 2 pre num 72), ale vychádza to nepárne. Nedokážem zistiť, prečo. Zaujímalo by ma, či niekto vidí niečo, čo nevidím.

$primes = [2]
$factors = []
num = 72
max = num

def isprime(n)
$primes.each do |x|
if n % x == 0 then
return
end
end
$primes.push(n)
return
end

i = 3
while i <= max
isprime(i)
i += 1
end

while !($primes.include?(num))
$primes.each do |x|
if num % x == 0 then
$factors.push(x)
num /= x
end
end
end
$factors.push(num)

puts $factors

odpovede:

1 pre odpoveď č. 1

Musíte zlomiť $primes.each akonáhle nájdete nejaký faktor, alebo ho zakaždým dokončíte.

while !($primes.include?(num))
$primes.each do |x|
if num % x == 0 then
$factors.push(x)
num /= x
break
end
end
end
$factors.push(num)

P.S: Len som sa držal algoritmickej strany a ignoroval som rubínovú stranu.


1 pre odpoveď č. 2

Vaša vnútorná slučka funguje takto. Zvážte, že skúšate číslo 72.
Vaše pole prvočísel bude [2,3,5,7...]

V $primes.each do |x| loop v prvej iterácii to otestuje num = 72 proti 2 a pridajte ho do priečinka factor rad

Inner Iteration 1 => factors = [2], x = 2 , num = 36
Inner Iteration 2 => factors = [2,3], x = 3 , num = 12
Inner Iteration 3 => factors = [2,3], x = 5 , num = 12
Inner Iteration 3 => factors = [2,3], x = 7 , num = 12
Inner Iteration 3 => factors = [2,3], x = 11, num = 12

Teraz existuje vnútorná iterácia a hlavná slučka začína znova od 2.

Inner Iteration 1 => factors = [2,3,2], x = 2 , num = 6
Inner Iteration 2 => factors = [2,3,2,3], x = 3 , num = 2

Vnútorná slučka sa začne znova

Inner Iteration 1 => factors = [2,3,2,3,2], x = 2 , num = 2

Musíte urobiť prestávku vo vnútornej slučke, aby ste urobili prvú faktorizáciu a výstup.

while !($primes.include?(num))
$primes.each do |x|
if num % x == 0 then
$factors.push(x)
num /= x
break
end
end