Autor | Zpráva | ||
---|---|---|---|
Gauner Profil * |
#1 · Zasláno: 9. 12. 2010, 17:37:27
Ahoj, mám takový dotaz, po dlouhý době jsem zase něco začal zkoumat v PHP a pro obnovení vědomostí jsem se rozhodl, že si naprogramuji program, který určí, zda-li dotyčné číslo je anebo není prvočíslem. To jsem víceméně zvládl bez problému, avšak rozhodl jsem se, že tomu zkusím dát ještě něco a chci, aby mi to vypsalo všechna prvočísla zadanému prvočíslu předcházející. Zkoušel jsem nějaké finty přes for, ale pokaždé jsem napsal nesmysl, nemohl byste mě někdo navést ke správnému zápisu? Když tak vřele děkuji.
|
||
ah01 Profil |
#2 · Zasláno: 9. 12. 2010, 17:43:04
Pokud neukážeš co si napsal, tak jediné k čemu tě můžeme navést, je nějaký algoritmus, který toto řeší, např.: Eratosthenovo síto.
|
||
Radovan789 Profil * |
#3 · Zasláno: 9. 12. 2010, 17:46:13
Gauner:
Můžeš sem aspoň napsat ten script který určí prvočíslo ? Urychlylo by to práci. |
||
xmark Profil |
#4 · Zasláno: 9. 12. 2010, 17:52:04
function jeprvocislo($vstup) { // tvůj algoritmus pro zjištění prvočísla } for ($i = 1; $i <= 100; $i++) { if (jeprvocislo($i)) { echo $i; } } |
||
Gauner Profil * |
#5 · Zasláno: 9. 12. 2010, 17:53:16
NA Eratosthenovo síto jsem už také koukal, avšak nevím, jak bych ho mohl zapojit, do mého algoritmu. Já mám obyčejný krátký algoritmus, který zjistí s formuláře, zda zadané číslo je prvočíslo, či není. Je to založené na smyslu, že číslo dělím od jeho počáteční hodnoty nahoru a pokud naleznu číslo, kterým je dělitelný beze zbytku (kromě 1 a toho čísla), tak mi to vypíše, že to není prvočíslo. Teď jsem přišel na to, že tenhle algoritmus musím zakomponovat do nějakého cyklu, avšak nevím, jakým způsobem. Já se omlouvám, řeším všechno složitě, nechtěl jsem sem vkládat můj kód, poněvadž chci, abych se nad tím problémem zamyslel a částečně na to přišel i sám, protože pouhé opisování mi nic nedá. :)
|
||
Gauner Profil * |
<?php for($i = 0; $i <= $cislo; $i++) { $overeni = true; $delitel = 2; while ($delitel <= ceil(sqrt($cislo))) { if ($cislo % $delitel == 0) { $overeni = false; $delitel = $cislo + 1; } else { $delitel++; } } } ?> |
||
Gauner Profil * |
#7 · Zasláno: 9. 12. 2010, 17:54:59
ach, ten cyklus hned na začátku do toho nepatří. :)
|
||
Gauner Profil * |
#8 · Zasláno: 9. 12. 2010, 17:55:33
a potom následuje: Když je ověření, tak je číslo prvočíslem, když ne, tak není.
|
||
Radovan789 Profil * |
#9 · Zasláno: 9. 12. 2010, 18:01:50
Gauner:
<?php $prvocislo = "127"; // Nějaké prvočíslo function jePrvocislo($cislo) { $overeni = true; $delitel = 2; while ($delitel <= ceil(sqrt($cislo))) { if ($cislo % $delitel == 0) { $overeni = false; $delitel = $cislo + 1; } else { $delitel++; } } return $overeni; } for ($i = 1; $i <= $prvocislo; $i++) { if (jeprvocislo($i)) { echo $i." "; } } ?> |
||
xmark Profil |
#10 · Zasláno: 9. 12. 2010, 18:03:40
Radovan789:
„$prvocislo = "127";“ Máš nějaký zvláštní důvod psát číslo v uvozovkách? |
||
Radovan789 Profil * |
#11 · Zasláno: 9. 12. 2010, 18:04:05
Gauner:
A ještě ti musím říct že 1 není prvočíslo tak si ten algoritmus uprav. |
||
Radovan789 Profil * |
#12 · Zasláno: 9. 12. 2010, 18:05:34
xmark:
Ne. |
||
Gauner Profil * |
#13 · Zasláno: 9. 12. 2010, 18:10:44
Dobře, děkuji. Tohle funguje, avšak kdybych chtěl použít php kód, bez těch funkcí, jak bych to musel změnit?
|
||
Radovan789 Profil * |
#14 · Zasláno: 9. 12. 2010, 18:13:49
Gauner:
Proč bys to měnil ? Funkce jeprvocislo($i) ti vrátí TRUE nebo FALSE, je to to nejjednoduší řešení, zvláště co se týká přehlednosti kódu. Ale kdybys to tak opravdu chtěl tak: for ($i = 1; $i <= $prvocislo; $i++) { $overeni = true; $delitel = 2; while ($delitel <= ceil(sqrt($cislo))) { if ($cislo % $delitel == 0) { $overeni = false; $delitel = $cislo + 1; } else { $delitel++; } } if ($overeni) { echo $i." "; } } |
||
Gauner Profil * |
#15 · Zasláno: 9. 12. 2010, 18:14:06
Je mi to trapné přiznat, jsem sotva začátečník a zatím jsem se ještě nenaučil používat. Tím spíš, že jsem se zatím obešel bez nich. Ono to slouží jako co? :)
|
||
Radovan789 Profil * |
#16 · Zasláno: 9. 12. 2010, 18:14:37
a $cislo změnit za $prvocislo
|
||
Radovan789 Profil * |
#17 · Zasláno: 9. 12. 2010, 18:17:13
Gauner:
funkce je část kódu kterou můžeš kdykoliv vyvolat a vrátí se ti něco, například: echo sqrt(9); // Vypíše 3 // Tvoje vlastní sestrojená funkce echo jePrvocislo(9); // Vypíše false |
||
_es Profil |
#18 · Zasláno: 9. 12. 2010, 18:19:27
Gauner:
Prečo nepoužiješ PHP kód z odkazu ah01 na Wikipédiu, ktorý robí presne to, čo chceš? |
||
Gauner Profil * |
#19 · Zasláno: 9. 12. 2010, 18:48:38
Tak se omlouvám, že stále otravuji, ovšem naskytl se problém. Jestliže použiji tento kód, tak je funkční, avšak trochu zvláštně. Program funguje tak, že jestliže zapíšu neprvočíslo, nic se nestane, avšak jestliže zapíši prvočíslo, tak se vypíše řada čísel po jedné až do toho zadaného prvočísla.
|
||
Radovan789 Profil * |
#20 · Zasláno: 9. 12. 2010, 18:50:48
Gauner:
Mě to jede, problém bude asi vtom to co jsem napsal ve [#16] příspěvku. |
||
Gauner Profil * |
#21 · Zasláno: 9. 12. 2010, 18:53:37
To ne, moji $cislo jsem změnil na $prvocislo a $prvocislo inicializuje uživatel. Přesto to vypíše jenom postup čísel po jednotkách. :D
|
||
Radovan789 Profil * |
#22 · Zasláno: 9. 12. 2010, 18:55:25
Gauner:
Mě to ale pořád funguje vyzkoušej si tohle z číslem 120: <?php $prvocislo = "120"; // Ted je to neprvočíslo function jePrvocislo($cislo) { $overeni = true; $delitel = 2; while ($delitel <= ceil(sqrt($cislo))) { if ($cislo % $delitel == 0) { $overeni = false; $delitel = $cislo + 1; } else { $delitel++; } } return $overeni; } for ($i = 1; $i <= $prvocislo; $i++) { if (jeprvocislo($i)) { echo $i." "; } } ?> |
||
_es Profil |
#23 · Zasláno: 9. 12. 2010, 18:57:47
Radovan789:
„$prvocislo = "120"; // Ted je to neprvočíslo“ A navyše to ani nie je číslo, ale textový reťazec. |
||
Gauner Profil * |
#24 · Zasláno: 9. 12. 2010, 18:59:45
A funguje vám to i s tím kódem bez použití funkcí? :)
|
||
Alphard Profil |
#25 · Zasláno: 9. 12. 2010, 19:06:12
Radovan789:
„Mě to ale pořád funguje vyzkoušej si tohle z číslem 120:“ Mně to vypíše 1 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 což je chybné. |
||
Radovan789 Profil * |
#26 · Zasláno: 9. 12. 2010, 19:07:08
_es:
Pro PHP možná ale pro mě a autora příspěvku ne. Nerozumím podstatě věcí tvého příspěvku. |
||
Radovan789 Profil * |
#27 · Zasláno: 9. 12. 2010, 19:08:15
Alphard:
Je to tak jak jsi autor příspěvku přál, tedy podle jeho algoritmu. |
||
Gauner Profil * |
#28 · Zasláno: 9. 12. 2010, 19:10:18
<?php
for ($i = 1; $i <= $prvocislo; $i++) { $je = true; $delenec = 2; while ($delenec <= ceil(sqrt($prvocislo))) { if ($prvocislo % $delenec == 0) { $je = false; $delenec = $prvocislo + 1; } else { $delenec++; } } if ($je) { echo $i." "; } } ?> Vyzkoušejte tento kód, kdy se $prvocislo = 11; vypíše se vám: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. |
||
Alphard Profil |
#29 · Zasláno: 9. 12. 2010, 19:14:50
<?php function jePrvocislo($cislo) { if(!is_int($cislo) || $cislo < 2) return false; $limit = floor(sqrt((int)$cislo)); for($delitel = 2; $delitel <= $limit; $delitel++) { if(($cislo % $delitel) === 0) { return false; } } return true; } for ($i = 1; $i < 11; $i++) { if (jePrvocislo($i)) { echo $i, "<br>"; } } |
||
Radovan789 Profil * |
#30 · Zasláno: 9. 12. 2010, 19:18:05
Gauner:
Budeš muset použít to stou vlastní funkcí protože for ve for nebo while ve for nerozjedeš. |
||
Téma pokračuje na další straně.
|
0