Kod prvocisla – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Kod prvocisla – Java – Fórum – Programujte.comKod prvocisla – Java – Fórum – Programujte.com

 

robin
~ Anonymní uživatel
28 příspěvků
21. 10. 2021   #1
-
0
-

   

Připojen obrázek.Ahoj, v tom druhem cyklu For, to j++ ,neni to tam vcelku k nicemu. Z prvniho cyklu se dosadi hodnota cisla a v druhem cyklu se podeli 2ma a upresni se Modulem,zda je cislo delitelne jinou hodnotou nez samo sebou. Chapu to dobre? Dekuji

Nahlásit jako SPAM
IP: 212.4.155.–
gna
~ Anonymní uživatel
1891 příspěvků
21. 10. 2021   #2
-
0
-

Nevím, co myslíš tím, že se podělí dvěma a upřesní modulem.

Modulo je zbytek po celočíselném dělení. Takže to zkouší jestli hodnota `i` je beze zbytku dělitelná hodnotou `j`. A zkouší to pro všechna `j` od 2 do i/j. Takže j++ tam samozřejmě má smysl.

Nahlásit jako SPAM
IP: 213.211.51.–
robin
~ Anonymní uživatel
28 příspěvků
22. 10. 2021   #3
-
0
-

Vratim se tedy k druhemu cyklu, pokud z prvniho cyklu obdržím např. hodnotu 6, tak dosadím( j=2; 2<=6/2;j++;) to znamena,ze je splnena podminka v druhem cyklu "For" a pokracuje se do "if" podminky. Co se deje pak s "j++"v druhem cyklu FOR, zvetsi se na hodnotu 3 a pak ( j=3; 3<=6/3;j++;) a pak ..konec ..., protoze 2 neni vetsi nez 3 nebo...??? Tohle mi dela problem nebo se pak uz prejde do prvniho "For" cyklu ?? Dekuji

Nahlásit jako SPAM
IP: 212.4.155.–
22. 10. 2021   #4
-
0
-

Má hledat prvočísla v rozsahu 2 až 100. První cyklus prochází tento rozsah (tj. 2, 3, 4, .... 99, 100), číslo se jmenuje i. Uvnitř tohoto cyklu se zjišťuje, zda je to prvočíslo. Hrubou silou by se to udělalo tak, že by otrocky podělil číslo i každým číslem z rozsahu 2 až i-1, číslo kterým dělí se jmenuje j. Ukončovací podmínka j <= i/j podle mého názoru zmenší počet iterací cyklu, protože nemá smysl zkoušet všechna čísla z rozsahu 2 až i-1. Koneckonců 6 není dělitelné č. 5.

Algoritmus zjišťuje, zda je číslo dělitelné jiným číslem. Pokud ano, modulo vrátí 0, pak je i dělitelné číslem j. Takže pokud uvnitř druhého cyklu vrátí modulo alespoň jednou 0, našel dalšího dělitele, a číslo není prvočíslo.

Pro případ č 6 vnitřní cyklus:
1. i = 6, j = 2.  Podmínka j <= i/j vrátí true, protože i/j je 3. Následně i % j vrátí 0 a podmínka uvnitř druhého cyklu vrací true a proměnnou je prvocislo nastaví na false. v tuto chvíli už nemá smysl dále zkoumat číslo i, je jasné, že není prvočíslo.
2. i = 6, j = 3.  Podmínka j <= i/j vrátí false, další iterace vnitřního cyklu neproběhne. Ani není nutná, že 6 není prvočíslo už víme.
3. výpis neprohěhne, proměnná jeprvocislo == false

Následuje další iterace vnějšího cyklu, kde i = 7 a opět se ve vnitřním cyklu zjišťuje, zda existuje další dělitel. Tentokrát v každé iteraci (asi bude opět jedna) vnitřního cyklu modulo vrátí nenulové číslo.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
22. 10. 2021   #5
-
0
-

Pozn.: zkus si to pro větší čísla, např 29, 30, 31. Pro ty bude více iterací vnitřního cyklu

hu

Nahlásit jako SPAM
IP: 195.178.67.–
gna
~ Anonymní uživatel
1891 příspěvků
22. 10. 2021   #6
-
0
-

Pokud jde konkrétně o to "i/j", tak to je nesmysl. Nebo ono to teda "nakonec zafunguje", ale je nesmyl to formulovat takhle.

Nahlásit jako SPAM
IP: 213.211.51.–
22. 10. 2021   #7
-
0
-

Mohl bys to matematicky zdůvodnit? A předložit podle tebe správné řešení?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
gna
~ Anonymní uživatel
1891 příspěvků
22. 10. 2021   #8
-
0
-

Jede to dokud je "j <= i/j". Nebo naopak: skončí to, když "j*j > i". Takže limit pro `j` je druhá odmocnina `i`. Proč to tak nenapsat rovnou?

Nahlásit jako SPAM
IP: 213.211.51.–
22. 10. 2021   #9
-
0
-

#8 gna
Druhá mocnina i tam nemá co hledat. Špatně jsi tu nerovnost upravil. Pokud nerovnost vynásobíme číslem j, pak dostaneme j*j <= i, tedy druhá mocnina j menší rovna i. V původní nerovnosti j nesmí být nula a tak násobení číslem j lze provést.

Možná existuje nějaká definice, která říká, že limit je pro takové j, které je menší rovno podílu i/j. Pak je jen otázka, zda má smysl upravit na j*j <= i, ono to na efektivitu nemusí mít vliv, ale dokonale to zakryje "původ" ukončovací podmínky.

Násobení vs dělení: dodnes používám 8051, která už od počátku měla instrukce MUL AB a DIV AB. Obě dokázala vykonat za 2 strojové cykly, takže tam nemohli šaškovat se složitým počítáním nějakým mikroprogramem (kdo ví, jestli něco takového znali). Zatímco násobení jsem viděl popsané jako kombinační logickou funkci, u dělení se pouze domnívám, že taková kombinační logická funkce existuje. Z toho usuzuji, že úprava výrazu na násobení efektivitu pravděpodobně nepřinese.

31 let po maturitě se toho hodně zapomene a existenci definice jsem neověřoval.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
gna
~ Anonymní uživatel
1891 příspěvků
22. 10. 2021   #10
-
0
-

Chtěl jsi to matematicky zdůvodnit. Neříkám, že to má přepsat na násobení, jen jsem na tom ukázal, že ten limit je druhá odmocnina. Na tom není co řešit.

Žádná definice s i/j neexistuje. Je to neintuitivní způsob, jak nakonec narazit na tu odmocninu. Představ si to pro číslo 100: 

2 <= 50
3 <= 33
4 <= 25
...
10 <= 10
konec

Bum:

for (j = 2; j <= sqrt(i); j++)
Nahlásit jako SPAM
IP: 213.211.51.–
23. 10. 2021   #11
-
0
-

Zatím to spíš vypadalo, že neumíš upravovat nerovnice.

Pokud bych si měl vybrat, tak bych raději použil celočíselné dělení. Navíc je následováno modulo, tedy zbytkem po celočíselném dělení. Po zkušenostech s algebrou na jednočipech se mi to jeví efektivnější než odmocnina a pak modulo (zřejmě se při něm spočítá i podíl, ale nevyužitý se zahodí).

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:3087:4b93:9e33:e1d9...–
gna
~ Anonymní uživatel
1891 příspěvků
24. 10. 2021   #12
-
0
-

Neříkám, že tam má být odmocňování. Jen vysvětluju, co to dělá.

A protože je evidentně strašný problém to pochopit, tak je nesmysl to dělat takhle "krypticky".

Nahlásit jako SPAM
IP: 213.211.51.–
24. 10. 2021   #13
-
0
-

Tak ukaž lepší řešení.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:1475:3e9d:5e8:34fa...–
gna
~ Anonymní uživatel
1891 příspěvků
24. 10. 2021   #14
-
0
-

Mně nějak nenapadá, jak jasně vyjádřit, že to zkouší jen čísla do odmocniny...   

Nahlásit jako SPAM
IP: 213.211.51.–
Kit+15
Guru
24. 10. 2021   #15
-
0
-

#14 gna
Podělím čísla a pokud je podíl menší než dělitel, končím.

Nahlásit jako SPAM
IP: 213.175.51.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
gna
~ Anonymní uživatel
1891 příspěvků
24. 10. 2021   #16
-
0
-

#15 Kit
Já jsem to myslel ironicky   

Nahlásit jako SPAM
IP: 213.211.51.–
24. 10. 2021   #17
-
0
-

je nesmysl to dělat takhle "krypticky".

Rozumím tomu tak, že to dělají špatně. Pořád čekám, že ukážeš lepší řešení.

Ve vláknu jsem pokračoval v naději, že se něco nového naučím. Moje očekávání jsi nenaplnil ani z části.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:417a:7b4a:cef8:72bf...–
gna
~ Anonymní uživatel
1891 příspěvků
25. 10. 2021   #18
-
0
-

Mě nejdříve ani nenapadlo, že by v tom "i/j" mohl být problém, i když i já jsem se nad tím musel zamyslet. Až z dalších komentářů mi došlo, že právě v tom asi je kámen úrazu.

Tak jsem matematicky i empricky osvětlil, co to dělá. Projde to `j` od 2 do odmocniny `i`. Tečka. Podle tebe jasná forma zakrývá význam nejasné formy, neumím upravovat nerovnice a jakásí ptákovina s nulou. OK

Nikomu necpu, že to musí být jinak, ale podlě mě je nesmysl psát neintuitivně, když to jde napsat jasně. Nejjasnější vyjádření odmocniny je odmocnina. 

for (j = 2; j <= sqrt(i); j++)

Samozřejmě je odmocnina výpočetně náročnější, ale stačí ji spočítat jen jednou a celý ten algoritmus může být efektivnější a blabla, ale o to původnímu autorovi zjevně nešlo, když se neobtežoval ani s breakem při zjištění výsledku.

Nahlásit jako SPAM
IP: 213.211.51.–
25. 10. 2021   #19
-
0
-

jakásí ptákovina s nulou

jestli narážíš na to, jak jsem zdůvodnil násobení číslem j při odstranění zlomku na pravé straně nerovnosti, tak ta ptákovina je z učebnice matematiky.

Samozřejmě je odmocnina výpočetně náročnější, ale stačí ji spočítat jen jednou a celý ten algoritmus může být efektivnější

možná ano.

S tím break při zjištění, že není prvočíslo, mne to napadlo taky. Vypadá to jako školní úloha a autorovi zřejmě nešlo o efektivitu, ale o známku.

Pokud si dobře vzpomínám, tak jsem školní úlohy dělal nerad, Jejich vyhotovení jsem odkládal (někdy až po rychlé opsání řešení o přestávce) a když už jsem se do toho dal, snažil jsem se mít co nejdřív hotovo. Takže žádný hon za efektivitou. "Vypadá to, že to funguje, tím pro mne práce na domácí úloze končí a jdu dělat něco, co mne baví." Dnešní studenti to asi nemají jinak. Jen těch možností opisovat mají trochu více, za nás nebyl internet.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
gna
~ Anonymní uživatel
1891 příspěvků
25. 10. 2021   #20
-
0
-

Jen ještě taková drobnost. Java umí DivMod a jestli překladač postřehne, že může obě operace udělat jednou instrukcí, tak je řešení s dělením parádička.

Nahlásit jako SPAM
IP: 213.211.51.–
Kit+15
Guru
25. 10. 2021   #21
-
+1
-
Zajímavé

#20 gna
DivMod umí i samotný procesor. Pokud chytřejší kompilátor narazí na instrukce div a mod blízko sebe, tak je sloučí.

Nahlásit jako SPAM
IP: 46.135.71.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Z_code
~ Anonymní uživatel
6 příspěvků
12. 12. 2021   #22
-
0
-

Ahoj - zde je má varianta. Prosím o posouzení zda na to nejdu zbytečně moc složitě? 

public class ClassPrvocislo {

    //Napište program který najde všechny prvočísla mezi 2 a 100
    public static void main(String[] args) {

        int o = 2; //rozsah od
        int d = 100; //rozsah do
        int[] p = new int[d + 1]; //inicializace pole čísel v požadovaném rozsahu
        for (int j = 0; j < p.length; j++) { //naplnění pole čísly
            p[j] = j;
        }

        for (int i = o; i < p.length; i++) {
            if (p[i] != 0) {
                for (int j = i; j < p.length; j++) {
                    if ((p[j] != 0) && (i != j) && (j % i == 0)) {
                        p[j] = 0;
                    }
                }
                System.out.print(p[i] + ", "); //výpis prvočísel v daném rozsahu
            }
        }

    }
}
Nahlásit jako SPAM
IP: 85.163.10.–
gna
~ Anonymní uživatel
1891 příspěvků
12. 12. 2021   #23
-
0
-

To je otázka, co je moc složité. Jednodušší řešení máš tady nahoře, ale to tvoje bych řekl, že je přímočaré řešení bez překvápek a v tomhle smyslu u mě vpoho.

Akorát u toho nulovacího cyklu je trochu nesmysl ty násobky "hledat", když můžeš jít přímo po nich. Ale to je jen drobnost.

for (int j = i + i; j < p.length; j += i)
    p[j] = 0;
Nahlásit jako SPAM
IP: 213.211.51.–
Z_code
~ Anonymní uživatel
6 příspěvků
12. 12. 2021   #24
-
0
-

#23 gna
No vidíš to mě vůbec nenapadlo jít přímo po násobcích. Díky za dobrý postřech. 

Nahlásit jako SPAM
IP: 85.163.10.–
Avriel960
Duch
16. 12. 2021   #25
-
0
-

#24 Z_code
Díky

Nahlásit jako SPAM
IP: 62.212.75.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 17 hostů

Podobná vlákna

Prvocisla — založil myky

Hledani prvocisla — založil loleklel

Prvočísla z matice — založil Lukáš

Prvočísla -Pascal — založil El97za

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý