Program na vypsání prvočísel do max.čísla - pomoc – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Program na vypsání prvočísel do max.čísla - pomoc – Java – Fórum – Programujte.comProgram na vypsání prvočísel do max.čísla - pomoc – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
aoedann0
Duch
26. 10. 2015   #1
-
0
-

Ahoj,

chtěl bych poprosit o pomoc se řešením problému (může se to zdát lehký, ale jsem začátečník a nějak v tom plavu). Mám za úkol napsat program, kde zadám maximální číslo a on vypíše všechna prvočísla až do tohoto čísla. Přičemž musím použít metody int vstupMaxCisla(), boolean jePrvocislo(int cislo) a void vypisPrvocislo(int prvocislo).

Zatím jsem byl schopný sesmolit jenom tohle:

import java.util.*;

public class Ppa1_cv05_1_A15B0047P
{
    
   
    static Scanner zadej = new Scanner(System.in);
    
    static int vstupMaxCisla()
    {
        System.out.print("Zadej max. cislo: ");
        int maxCislo = zadej.nextInt();
        
        return maxCislo;
    }
    
    static boolean jePrvocislo(int cislo)
    {
        int maxCislo = vstupMaxCisla();
            for(int j=2; j<maxCislo - 1; j++)
            {
                double jecineni = (maxCislo - 1) % j;
                if(jecineni == 0.0) return false;
            }
        
        return true;
    }
    
    static void vypisPrvocislo(int prvocislo)
    {
       int maxCislo = vstupMaxCisla();
        for(int i=2; i<maxCislo; i++) // cisla, ktera jsou v intervalu od 2 do maxCisla
        { 
            if(jePrvocislo(i))
                System.out.print(i +", ");
            
        }
        
    }
    
    public static void main(String[] args)
    {
        
        vstupMaxCisla();
        System.out.println("---Vysledky---");
        vypisPrvocislo(prvocisla);
        
        
    }
       
}
Nahlásit jako SPAM
IP: 147.228.209.–
Kit+15
Guru
26. 10. 2015   #2
-
0
-

#1 aoedann
Pro začátek zruš všechny "static" a nechej pouze jedno u metody main(). Pak můžeme pokračovat.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:51a3:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
aoedann0
Duch
26. 10. 2015   #3
-
0
-

#2 Kit
Dobrá, to jsem udělal, ani nevím, proč jsem tam ty static psal.

Nahlásit jako SPAM
IP: 147.228.209.–
Řešení
Kit+15
Guru
26. 10. 2015   #4
-
0
-
Vyřešeno Nejlepší odpověď

#3 aoedann
Tak jedno popostrčení: 

boolean jePrvocislo(int cislo) {
    for (int j = 2; j < cislo; j++) {
        if (cislo % j == 0) {
            return false;
        }
    }
    return true;
}

Je v tom ale drobná chyba: Číslo 2 označí nesprávně. Zkus to opravit.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:51a3:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
aoedann0
Duch
27. 10. 2015   #5
-
0
-

#4 Kit
Napadá mě jenom, že bych do té podmínky ještě přidal && j != 2, jenomže mi to připadá jako blbost, když j začíná od dvou. Nebo začít j = 3, jenomže to netuším, jestli by mi tu dvojku pak vypsalo.

Nahlásit jako SPAM
IP: 147.228.209.–
NotBeginner
~ Anonymní uživatel
185 příspěvků
27. 10. 2015   #6
-
0
-

Zde ti to nejspíš vyřešil spolužák :

http://www.itnetwork.cz/java/diskuzni-forum-java/eclipse-56267813e78d4

Nahlásit jako SPAM
IP: 217.112.161.–
Kit+15
Guru
27. 10. 2015   #7
-
0
-

#5 aoedann
Přitom je to docela prosté: 

boolean jePrvocislo(int cislo) {
    if (cislo == 2) {
        return true;
    }
    for (int j = 2; j < cislo; j++) {
        if (cislo % j == 0) {
            return false;
        }
    }
    return true;
}

Někdy programátor hledá "silver bullet", ale přitom stačí přidat jednu podmínku před vstupem do cyklu, která podchytí zbývající stav a je to.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:51a3:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
27. 10. 2015   #8
-
0
-

#7 Kit
a co teprve zjisteni ze neni potreba prochazet vsechny cisla:

// Napriklad cislo 64:
2 * 32
4 * 16
8 * 8   // tady mame odmocninu ze 64
// a ted se podrz:
16 * 4
32 * 2
// coz je velice napadne podobne tomu co bylo na zacatku :D


Tim padem staci pocitat jen do odmocniny z cisla, nebo spise   j*j <= cislo. Kdyz to nenaslo zadny delitel pred odmocninou (vcetne), nenaje ani po nem. Zaroven to cirou nahodou vypada jako ten tvuj "silver bullet", protoze 2*2 < 2 je false, tudiz to cyklus rovnou preskoci, to same u trojky.

A ted si matne vzpominam ze jednicka neni prvocislo. Coz ty hlasis ze je.

Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
27. 10. 2015   #9
-
0
-

#8 KIIV
Máš pravdu. Jen jsem nechtěl ten příklad úplně překopat, aby ho aoedann poznal.

Jasně, ani dvojka či trojka nejsou prvočísla.

Z těchto důvodů se hodí dělat testy, které podobné nedostatky odhalí.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:51a3:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
27. 10. 2015   #10
-
0
-

#9 Kit
jednicka neni prvocislo, 2 a 3 uz jsou.

Ale kdyz ted nad tim premyslim, u te tvoji verze to musi fungovat i bez te podminky pred cyklem..

Vzdyt pro 2 se cyklus nevykona - jelikoz  2 < 2 je false a rovnou to skoci za cyklus tez.

Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
27. 10. 2015   #11
-
0
-

#10 KIIV
Jednička není prvočíslem, protože je dělitelná sedmi. Dvojka je dělitelná pěti, trojka zase sedmnácti...

Dopodrobna jsem ten svůj cyklus nezkoumal, protože jsem si na tu metodu nenapsal test. Možná ho napíši, až se probudím...

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:51a3:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
aoedann0
Duch
27. 10. 2015   #12
-
0
-

Tak jsem nakonec nějak sesmolil ty metody (jsme si dost možná skoro určitě jistý, že by měly být správně), ale vyskytl se další problém, nějak neumím pracovat s metodou boolean. První hodím proměnou int, která mi z metody nactiCislo načte mnou zadané číslo, pak dám proměnou (pravděpodobně boolean), která načte z metody jePrvocislo(mnou zadaná proměnná) jestli je to true nebo false, ale teď nevím, jak do metody vypisPrvocislo dostat inty, který jsou true, z booleanu, aby proběhlo poslední vyházení zbytku neprvočísel a vypsání prvočísel.

Poprosil bych o menší radu, pokud bude možno. 

Nahlásit jako SPAM
IP: 147.228.209.–
aoedann0
Duch
27. 10. 2015   #13
-
0
-

#11 Kit
zatím tedy mám metodu main() takhle:

public static void main(String[] args)
    {
        
        int maxCislo = vstupMaxCisla();
        boolean prvocisla = jePrvocislo(maxCislo);
        
        System.out.println("---Vysledky---");
        vypisPrvocislo();
        
        
    }

maxCislo mi bere číslo, který zadám, a pak to číslo boolean projede na true a false, ale pak nastává ta věc, kterou jsem popsal předtím, nevím, jak vzít ty true čísla a projet je tou poslední metodou vypisPrvocislo()

Nahlásit jako SPAM
IP: 147.228.209.–
aoedann0
Duch
1. 11. 2015   #14
-
0
-

Tak jsem to nakonec vyřešil, jsem to ale jedno vyhynulé ptactvo, přitom to bylo tak lehký. Děkuji všem, kteří reagovali, vaše příspěvky byly velice nápomocné, k tomu abych dokázal pochopit, jak to celý funguje.

Nahlásit jako SPAM
IP: 147.228.209.–
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, 10 hostů

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ý