Diskuze: Zisk všech přirozených čísel, které jdou dělit 3 a 5 pod deset
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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:
<?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++;
}
<?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++
}
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?
Tak to ti já bohužel neporadím, na algoritmizaci nejsem 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ší.
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.
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.
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);
Viem ti to napisat aj vseobecne pri viac deliteloch, ale pri 2 cislach staci
takto
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.
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)
Zobrazeno 11 zpráv z 11.