Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
pgarsky
Člen
Avatar
pgarsky:2.10.2018 18:42

Ahoj,
napsal jsem si kód, jak najít všechny přirozená čísla, které jdou dělit 3 a 5 a jsou menší než 10.

Zkusil jsem:

<?php
$numbers = 10;
$divident = 1;
$result = null;
$naturalNumbers = [];

while ($divident < $numbers) {
    $result = $divident / 3;

    if (!is_float($result)) {
        $naturalNumbers[] = $divident;
    }

    $result = $divident / 5;

    if (!is_float($result)) {
        $naturalNumbers[] = $divident;
    }

    $divident++;
}

print_r($naturalNumbers);

Chci docílit: Zajímalo by mě, jestli by tento kód šel napsat nějak lépe?

Odpovědět
2.10.2018 18:42
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Odpovídá na pgarsky
Martin Konečný (pavelco1998):2.10.2018 18:58

Ahoj,

pokud pro to neexistuje nějaký konkrétní "lepší" matematický algoritmus, pak tam vidím pouze opakující se kód, který se dá zjednodušit. Napadají mě dvě možnosti:

  1. zabalit si postup výpočtu do funkce
<?php

function isDivisible($divident, $number)
{
        $result = $divident / $number;

        return !is_float($result);
}


$numbers = 10;
$divident = 1;
$naturalNumbers = [];

while ($divident < $numbers) {
        if (isDivisible($divident, 3) || isDivisible($divident, 5)) {
                $naturalNumbers[] = $divident;
        }

        $divident++;
}
  1. udělat si pole čísel, kterými to chceš dělit a projít to cyklem
<?php

$numbers = 10;
$divident = 1;
$naturalNumbers = [];
$numbersDivide = [3, 5];

while ($divident < $numbers) {
        foreach ($numbersDivide as $number) {
                $result = $divident / $number;

                if (!is_float($number)) {
                        $naturalNumbers[] = $divident;
                }
        }

        $divident++;
}

Pozn.: Píšu to z hlavy, nemusí to být 100% funkční řešení, spíš jen nástin toho, jakým způsobem by to zjednodušit šlo.

Edit: Ještě by šlo místo while použít cyklus for, protože předem znáš počet opakování.

<?php

$numbers = 10;
$divident = 1;

for ($divident; $divident <= $numbers; $divident++) {
        // stejný postup jako u předchozích příkladů, jen už nemusíš na konci psát  $divident++
}
Editováno 2.10.2018 19:00
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
2.10.2018 18:58
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
pgarsky
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
pgarsky:2.10.2018 19:22

Děkuji, ta odpověď za "b" je přesně to, co jsem myslel. A jestli se ještě mohu pro zajímavost zeptat - byl by nějaký lepší algoritmus na spočítání než ten, co jsem vymyslel?

Nahoru Odpovědět
2.10.2018 19:22
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Odpovídá na pgarsky
Martin Konečný (pavelco1998):2.10.2018 19:51

Tak to ti já bohužel neporadím, na algoritmizaci nejsem :D Snad někdo z kolegů poradí lépe.
Mělo by to ale ještě jít přes dělení modulem, které ti vrací zbytek po dělení. Tedy např. 10 % 3 = 1, 12 % 3 = 0. Tedy jde i místo

<?php
$result = $divident / $number;

if (!is_float($result)) {
        // OK
}

// udělat i
$result = $divident % $number;

if ($result === 0) {
        // OK
}

ale je to jen jiná možnost řešení, nedokážu říct, jestli v některých situacích je něco z toho lepší.

Nahoru Odpovědět
2.10.2018 19:51
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
pgarsky
Člen
Avatar
Nahoru Odpovědět
2.10.2018 20:06
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na pgarsky
Martin Dráb:2.10.2018 20:22

byl by nějaký lepší algoritmus na spočítání než ten, co jsem vymyslel?

Pokud hledáš čísla dělitelná 3 nebo 5 a menší než deset, přijde mi lepší si je prostě definovat jako konstantu. Zejména, pokud je plánuješ hledat v programu často. To je stejné jako u třídících algoritmů – pokud je prvků málo, nemá smysl (ba naopak, je to neefektivní) používat sofistikované algoritmy, protože než se řádně zinicializují, ty jednoduché už jsou dávno s prací hotové.

Co se týče hledání všech přirozených čísel dělitelných 3 a 5 menších než nějaké N, prostě vezmi 3 a 5 a postupně k nim přičítej 3 a 5, dokud se nedostaneš k N. Tím dostaneš všechny násobky 3 nebo 5 v daném intervalu. Je potřeba ošetřit, abys nějaké nenašel dvakrát (třeba 15 je dělitelná 3 i 5), například při sbírání násobků pěti prostě přeskočit ty dělitelné třemi.

Nahoru Odpovědět
2.10.2018 20:22
2 + 2 = 5 for extremely large values of 2
Avatar
pgarsky
Člen
Avatar
Odpovídá na Martin Dráb
pgarsky:2.10.2018 21:03

Zkusil jsem tedy napsat tento zdrojový kód. Ale jak by se při dělitelnosti 3 u násobků 5 dalo toto číslo přeskočit?

$nasobky3 = 0;
$nasobky5 = 0;
$vysledek = 1000;
while ($nasobky3 < $vysledek - 3) {
    $nasobky3 += 3;

    echo $nasobky3 . " ";
}

echo "<br />";
echo "<br />";

while ($nasobky5 < $vysledek - 5) {

    if ($nasobky5 % 3 == 0) {
        // Přeskočit
    } else {
        $nasobky5 += 5;
    }

    echo $nasobky5 . " ";
}

Zkusil jsem různé způsoby, ale při většině se se mi webová aplikace zacyklila do nekonečna prohlížeč spadl.

Nahoru Odpovědět
2.10.2018 21:03
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Odpovídá na pgarsky
Vladislav Domin:2.10.2018 21:56

Ak chces len cisla delitelne 3 a 5, tak to bude

i * 3 * 5 = tj.. 0,15,30,45,60

popripadne kratsi kod ako mas ty

<?php
$naturalNumbers = [];
$max = 100;

for ($i = 0; $i <= $max; $i+=5)
    if (($i % 3) == 0)
        $naturalNumbers[] = $i;

print_r($naturalNumbers);
 
Nahoru Odpovědět
2.10.2018 21:56
Avatar
Odpovídá na Vladislav Domin
Vladislav Domin:2.10.2018 22:11

Viem ti to napisat aj vseobecne pri viac deliteloch, ale pri 2 cislach staci takto :-)

 
Nahoru Odpovědět
2.10.2018 22:11
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na pgarsky
Martin Dráb:2.10.2018 22:35

Třeba takto:

while ($nasobky5 < $vysledek - 5) {
    if ($nasobky5 % 3 != 0) {
      echo $nasobky5 . " ";

    $nasobky5 += 5;
}

Nebo v lichých iteracích přičítat 5, v sudých 10 (k nasobky5). Klidně to rozepsat tak, že se počet iterací sníží na polovinu.

Editováno 2.10.2018 22:36
Nahoru Odpovědět
2.10.2018 22:35
2 + 2 = 5 for extremely large values of 2
Avatar

Člen
Avatar
Odpovídá na pgarsky
:3.10.2018 12:39

Už som roky nič nenapísal v PHP, ale toto by nefungovalo?

$numbers = 10;
$divident = 1;
$naturalNumbers = [];

while ($divident < $numbers) {
  $divident % 3 || $divident % 5
    ? ;
    : $naturalNumbers[] = $divident;
  $divident++;
}

print_r($naturalNumbers)
Editováno 3.10.2018 12:39
 
Nahoru Odpovědět
3.10.2018 12:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.