Autor Zpráva
Holicz
Profil
Zdravím. Udělal jsem si script, který k zadanému číslu zjistí všechny jeho dělitele (čísla, kterým se dá dělit). Script prohledává jen prvočísla, protože i "normální" čísla by byla zbytečnost. Když jsem tento script dodělal napadlo mě, že si udělám i script pro nejmenší společného dělitele. Ten už mám, ale narazil jsem. Pokud zadám např. čísla 143 a 20, tak ty nemají žádného společného dělitele. Respektive mají jednoho 143*20. Já ověřuji jen prvočísla do 937. Když tedy zadám čísla 143 a 20 scriptu vyprší 20 sekund a neprovede se. Lze ještě před tímto limitem nějak do kódu dát, že pokud společného dělitele nemají vypíše se, že mají pouze dělitele ČÍSLO*ČÍSLO?
Kód na nejmenšího společného dělitele:
<?php
$prvocisla=array(); // Výčet prvočísel jsem smazal, aby byl kód přehlednější
  function  isOutputInt ($cislo_1,$cislo_2) {
    if  ($cislo_1 == 0 || $cislo_2 == 0) return  0;
      return  ((intval ($cislo_1/$cislo_2) == ($cislo_1/$cislo_2)) ? 1 : 0);  // funkce zjišťuje, zda je číslo celé (nemá desetinná místa)
  }
if(isset($_POST['zjisti'])){
$cislo = $_POST['cislo'];
$cislo2 = $_POST['cislo2'];
$cislop = "0";
echo "<br><br>Zadal jsi čísla <b>$cislo</b> a <b>$cislo2</b> jejich nejmenší dělitel je: <br>";
while($cislop != ""){
if (isOutputInt($cislo,$prvocisla[$cislop]) == "1")
{ if (isOutputInt($cislo2,$prvocisla[$cislop]) == "1")
{
echo $prvocisla[$cislop];
echo "<br>";
die(); }}
$cislop++;
if ($cislop == $cislop2)
{ die(); }}}
?>


Živá ukázka:
Nejmenší společný dělitel
Zjištění dělitele
Alphard
Profil
Holicz:
Lze ještě před tímto limitem nějak do kódu dát, že pokud společného dělitele nemají vypíše se, že mají pouze dělitele ČÍSLO*ČÍSLO?
$end = time()+15; // 15 je limit

while (true)
{
  sleep(1); // neco delej
  if ($end < time()) break;    
}

Jinak Eukleidův algoritmus.

A ta "normální čísla" jsou složená čísla.
Holicz
Profil
Děkuji, už to funguje jak má. Za poučky o složených číslech taktéž děkuji.

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:

0