Autor Zpráva
wokie
Profil *
Ahoj, mám za úkol napsat program, který po zadání čísla vypíše všechna prvočísla, která jsou před ním. Zatím jsem se dostala k tomu, že mi to vypíše všechna neprvočísla, která jsou před ním :D Nějaké nápady prosím?
<form name="prvocisla" method="GET" action="#">
<p>Číslo, u nějž chcete znát prvočísla, která mu předcházejí: </p> 
<input type="text" name="cislo" />
<input type="submit" name="OK" value="OK" />
</form>
<?php
if (isset($_GET["OK"])) {
if (!empty($_GET["cislo"])) {
$cislo = $_GET["cislo"];
$i = $cislo;

while ($i > 1){
$s = $i-1;



		while ($s > 1) {
		if (($i % $s) == 0) {echo $i. " neni prvocislo <br>";}
		
			
		
		$s--;
		}







$i--;
}
}
}


?>
Alphard
Profil
Tady máte funkci, která zjistí, jestli je zadané číslo prvočíslo:
function jePrvocislo($cislo)
{
  $limit = ceil(sqrt((int)$cislo));
  for($delitel = 2; $delitel <= $limit; $delitel++)
  {
    if(($cislo % $delitel) === 0)
    {
      return false;
    }
  }
  return true;
}


Na vaše zadání je ale jako dělané Eratosthenovo síto - Wikipedie, otevřená encyklopedie.
imploder
Profil
wokie:
Zatím jsem se dostala k tomu, že mi to vypíše všechna neprvočísla, která jsou před ním :D Nějaké nápady prosím?
Toho můžeš jednoduše využít. Uděláš si na začátku proměnnou je_prvocislo a nastavíš ji na 1. Když se najde dělitel, nastaví se ta proměnná na 0. Prvočíslo se pak pozná podle toho, že na konci bude v té proměnné pořád ještě 1 (tj. nenašel se dělitel -> je to prvočíslo).
<?php
if (isset($_GET["OK"])) {
if (!empty($_GET["cislo"])) {
$cislo = $_GET["cislo"];
$i = $cislo;
$je_prvocislo = 1;

while ($i > 1){
$s = $i-1;



        while ($s > 1) {
        if (($i % $s) == 0) { $je_prvocislo = 0; }
        
            
        
        $s--;
        }







$i--;
}
if ($je_prvocislo==1) { echo $i. " je prvocislo <br>"; }
else { echo $i. " neni prvocislo <br>"; }
}
}


Řešení, které jsi zvolila, je velice neefektivní, protože v kroku s se (s*(s-2))krát počítá zbytek po dělení. Alphardovo řešení - Erathostenovo síto - je mnohem efektivnější. Ale pokud jde jenom o to nějak to naprogramovat a na efektivitě nezáleží, můžeš zůstat u toho svojeho.
Alphard
Profil
imploder:
můžeš zůstat u toho svojeho
Bylo by dobré zabudovat tam aspoň tu odmocninu. U velkých čísel to udělá významný rozdíl.
wokie
Profil *
Erathostenovo síto jsem zkoušela, uložila jsem si do pole všechny čísla, která to číslo obsahuje (takže u 7 array(1,2,3,4,5,6,7)) a postupně dělila jeho členy vždy tím prvním co zbyl.. ale narazila jsem na nějaký problém, myslím že to byly prázné hodnoty pole nebo neco takového... Asi to nebylo moc fajn reseni.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: