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

Hledani prvocisla – Java – Fórum – Programujte.comHledani prvocisla – Java – Fórum – Programujte.com

 

loleklel
~ Anonymní uživatel
10 příspěvků
27. 10. 2010   #1
-
0
-

ahoj vsichni,
zacal jsem ve skole programovat v jave, ale nikdy jsem v jave ani jinych prog. jazycich neprogramoval.

mame za ukol napisat program pro výpočet všech prvočísel menších než maxCislo (maxCislo bude > 2). V programu mam pouzit nasleduji metody: int, boolean, void...

zacal jsem tento programek psat ale zasekl jsem se u toho abych overil vsechny prvocisla mensi nez maxCislo :-)
nevite co delam spatne a jestli aspon neco je dobre??
diky moc



import java.util.*;

public class prvocisla {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Zadej max. cislo: ");
int zadaneCislo = sc.nextInt();
}

public static boolean jePrvocislo (int cislo) {
int delenec = 2;
for (cislo=2; cislo<zadaneCislo; cislo++){
if (cislo % delenec<zadaneCislo==0){
System.out.print (jePrvocislo);

}
return true;
}
}


}
}

Nahlásit jako SPAM
IP: 147.228.209.–
petr.satka0
Newbie
27. 10. 2010   #2
-
0
-

To loleklel :
Zdravím.
Začni tím, že si prostuduješ jak má vůbec takový program v Javě vypadat. Až to budeš mít, tak si problém rozlož na podproblémy. Například budeš potřebovat metodu vracející boolean, která bude kontrolovat zda jedno jediné číslo je prvočíslo. Tuto metodu pak můžeš volat v cyklu pro všechna čísla od 2 po MaxCislo. K tomu kódu, co jsi tu postnul, se moc říct nedá. Snad jen, že je to špatně :smile1:

S konkrétním problémem ti každý určitě rád poradí, ale základy si musíš nastudovat sám.

Nahlásit jako SPAM
IP: 217.112.175.–
Herm0
Newbie
27. 10. 2010   #3
-
0
-

To loleklel :

nemam moc času, tak ve zkratce, udělaš cyklus A a B př.



for(int a=0; a<maxCislo; a++) {
for(int b=2;b<a;b++){
cislo = a/b;
}
}



pokuď proměna cislo bude obsahovat celočiselnou hodnotu tak cyklus B ukončime, a cyklus a přejde na další čislo. Evidetně cislo nebude prvnocislo kdyz vyjde cele čislo, až na vyjimku kdy dělíme 1 nebo samosebou, proto u cyklu B začinej nejlépe od 2. Co se týče dělení samosebou tak tam dáš jednouduchou podmínku. Mno a pokut bude promena cislo obsahovat neceločíselnou hodnotu tak bude pokračovat a pokut cyklus B dojde až nakonec tak máš prvo číslo. Zvládneš to i sám, je to jednoduché. Pokuď víš jak prvočíslo funguje. Nejlepe si vem papir a napiš si algoritmus, třeba pomocí vyvojového diagramu ktery jste se nejspíš ve škole učili, (ja to tak aspoň dělám co se týče matematických algoritmu) a pak si projdi podle papíru v hlavě třeba 20 čísel a uvidíš jak to krásně funguje:)

Nahlásit jako SPAM
IP: 90.181.81.–
petr.satka0
Newbie
27. 10. 2010   #4
-
0
-

To Herm :
Menší optimalizace: stačí ověřovat od 2 po a/2.

Vzhledem k tomu, že loleklel má použít tři metody void, int a boolean, tak to bude muset trochu rozložit.

Nahlásit jako SPAM
IP: 217.112.175.–
KIIV
~ Moderátor
+43
God of flame
27. 10. 2010   #5
-
0
-

nejrychlejsi je na to jo eratosthenovo sito ..

To petr.satka : muze byt i tvoje optimalizace .. hned se zmensi pole na polovinu

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
lump
~ Anonymní uživatel
2 příspěvky
28. 10. 2010   #6
-
0
-

Menší optimalizace: stačí ověřovat od 2 po a/2.


Lepší optimalizace základního algoritmu je hledat čísla pouze do druhé odmocniny z maxCislo. Všechna další řešení už jsou symetrická (např. pro 100 = 25 * 4 = 4 * 25).

Nahlásit jako SPAM
IP: 86.61.140.–
Dejmas0
Duch
28. 10. 2010   #7
-
0
-

Prvočísly jsem se zabíval taky, soustředil jsem se na to, aby moje zjišťovací funkce byla co nejvýkonější. Zahrnuje i lumpův poznatek. Dám ti jí sem! :) Poslední verze zní takle:



static boolean JePrvocislo(int cislo)
{
if (cislo != 0)
for (int i = (int)Math.sqrt(cislo); i != 1; --i)
if ((cislo % i) == 0)
return false;
return true;
}

uží si to! :)

Nahlásit jako SPAM
IP: 85.160.126.–
petr.satka0
Newbie
28. 10. 2010   #8
-
0
-

To Dejmas :
0 a 1 nejsou prvočísla. Tvoje funkce pro 0 a 1 vrátí true. A podmínky v cyklech doporučuji nekontrolovat na rovnost/nerovnost, ale radši >, <. Například i > 1. Tady to ani tak nevadí, ale pokud bys pracoval s reálnými čísly, mohlo by to dělat problém.

Edit: A také by se hodilo ošetřit záporná čísla jinak, než pomocí ArithmeticException: / by zero :)

Nahlásit jako SPAM
IP: 217.112.175.–
Krychlik
~ Anonymní uživatel
195 příspěvků
28. 10. 2010   #9
-
0
-

To Dejmas : Tvoje funkce je hodne daleko od optimalni. Pro jedno cislo jsou mnohem lepsi pravdepodobnostni metody. Pro sito je zase lepsi jit odspodu a testovat delitelnost jenom prvocislama.

Nahlásit jako SPAM
IP: 78.128.199.–
loleklel
~ Anonymní uživatel
10 příspěvků
29. 10. 2010   #10
-
0
-

chlapi, neco jsem zkusil vytvorit, ale nejakym zpusobem mi to nefunguje, vypise se mi jen cislo, ktere zadavam. :(
co tam mam spatne a jak to muzu predelat? poradite nekdo ?
pripadam si strasne hloupe, ze tomu moc nerozumim, tak snad je to tim, ze kazdy zacatek je tezky ? :)

zde je kod co jsem napsal:



import java.util.*;

public class Prvocisla_vypis_ter {

public static int vstupMaxCisla () {
Scanner sc = new Scanner(System.in);
System.out.print("Zadej max. cislo: ");
int maxCislo = sc.nextInt();
return maxCislo;
}

public static boolean jePrvocislo (int cislo){

for(int a=0; a <cislo; a++) {
for(int b=2;b<a;b++){
cislo = a/b;
if(a%b==0)
return false;
}
}
return true;
}

public static void main(String[] args) {
int cislo = vstupMaxCisla();
if (jePrvocislo(cislo))
System.out.print (cislo);

}

}

Nahlásit jako SPAM
IP: 147.228.209.–
liborb
~ Redaktor
+18
Guru
29. 10. 2010   #11
-
0
-

Jednak ta funkce jePrvocislo je špatně. To tvoje prvotina byla lepší. Má v ní být jeden cyklus (ten vnořený), a to pro začátek (na "dobré" rady ohledně optimalizací a hádek kolem nich se v klidu vykašli :)) od 2 do cislo - 1, takže:

for b = 2;b < cislo - 1;b++) {
a následně je potřeba zjistit, jestli číslo z toho cyklu dělí to testované číslo:
if ((cislo % b) == 0) return(false);
A poslední úpravou je "přesunutí" cyklu od 2 do cislo (prvočísla začínají od 2) do mainu, kde pak budeš mít něco na způsob:
for (a = 2;a <= cislo;a++) {

if (jePrvocislo(a)) System.out.println(a);
}

Nahlásit jako SPAM
IP: 78.80.52.–
KIIV
~ Moderátor
+43
God of flame
29. 10. 2010   #12
-
0
-

To liborb : a uplne nejlepsi je v tomto zpusobu pak pouzit

for b = 2; b*b < cislo - 1;b++) {

zrychli to velice vyrazne

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
loleklel
~ Anonymní uživatel
10 příspěvků
31. 10. 2010   #13
-
0
-

To liborb :

tak jsem to zkusil udelat jak mi radil liborb, ale haze mi to nejakou chybu pri kompilaci.
Poradi nekdo ??

import java.util.*;


public class Prvocisla_vypis2 {

public static int vstupMaxCisla () {
Scanner sc = new Scanner(System.in);
System.out.print("Zadej max. cislo: ");
int maxCislo = sc.nextInt();
}

public static boolean jePrvocislo (int cislo){
int vstupMaxCisla= 0;

for(int b = 2;b < vstupMaxCisla - 1;b++) {
if ((vstupMaxCisla % b) == 0) return(false);
}

}

public static void main(String[] args) {

for (int a = 2; a<= vstupMaxCisla;a++) {
if (jePrvocislo(a))
System.out.println(a);

}

}


}

Nahlásit jako SPAM
IP: 88.100.161.–
liborb
~ Redaktor
+18
Guru
31. 10. 2010   #14
-
0
-

Jakou chybu? Tam se většinou píše, kde ta chyba je a někdy se z toho i dá pochopit, co je potřeba opravit.

Nahlásit jako SPAM
IP: 195.189.142.–
loleklel
~ Anonymní uživatel
10 příspěvků
31. 10. 2010   #15
-
0
-

To loleklel :

pise chybu:

Prvocisla_vypis2.java:22: cannot find symbol
symbol : variable vstupMaxCisla
location: class Prvocisla_vypis2
for (int a = 2; a<= vstupMaxCisla;a++) {
^
1 error
>Exit code: 1

Nahlásit jako SPAM
IP: 88.100.161.–
liborb
~ Redaktor
+18
Guru
31. 10. 2010   #16
-
0
-

Tak to píše správně, protože tu proměnou v daném kontextu nemáš definovanou. Možná si chtěl zavolat stejnojmennou funkci, ale volání funkce se odlišuje přidáním závorek ().
Když už jsme u té funkce, tak ta nic nevrací, ač by měla - chybí ti tam return(maxCislo);
A poslední chyba, kterou vidím :), je ve funkci na testování, jestli je dané číslo prvočíslo. Hezky předáš to číslo jako parametr, ale pak testuješ stále 0, kterou inicializuješ lokální proměnnou. Musíš tam pracovat s tou proměnnou (parametrem) cislo. A po skončení cyklu to musí vrátit true.

Nahlásit jako SPAM
IP: 195.189.142.–
petr.satka0
Newbie
31. 10. 2010   #17
-
0
-

To loleklel :
Přikládám dvě menší nakopnutí. Přijde mi, že se v tom docela ztrácíš, tak přikládám narychlo splácaný pseudo-vývojový diagram. Zkus se ho při implementaci držet.
Druhá věc je vysvětlení kontextu. V programu budeš mít přístup jenom k tomu co máš deklarováno/definováno ve stejné barevné (mrkni na obrázek) oblasti, nebo v oblasti nadřazené. V tmavě červené budeš vidět všechno ze světle-červené a žluté, ale ne už z modré, nebo zelené. Ze světle-zelené zase vidíš jen do žluté, ale ne už do červené.

Nahlásit jako SPAM
IP: 217.112.175.–
petr.satka0
Newbie
31. 10. 2010   #18
-
0
-

To petr.satka : ještě kontext

Nahlásit jako SPAM
IP: 217.112.175.–
loleklel
~ Anonymní uživatel
10 příspěvků
31. 10. 2010   #19
-
0
-

diky vsem..uz jsem to konecne dal do kupy :smile1:

Nahlásit jako SPAM
IP: 88.100.161.–
ludvig
~ Anonymní uživatel
1 příspěvek
23. 2. 2016   #20
-
-2
-
Mimo téma
Nahlásit jako SPAM
IP: 178.253.129.–
Petr Tomšej
~ Anonymní uživatel
2 příspěvky
3. 12. 2020   #21
-
0
-
Nahlásit jako SPAM
IP: 77.95.193.–
Petr Tomšej
~ Anonymní uživatel
2 příspěvky
3. 12. 2020   #22
-
0
-

#10 loleklel
Vubec neni spatne, ale chybi ti par detailu.

public static void main(String[] args) {
        int cislo = vstupMaxCisla();
        System.out.println("prvocisla do cisla "+cislo+" jsou: ");
        for (int i = 2; i <= cislo; i++)
        {
        if (jePrvocislo(i))

        System.out.print (""+i+", ");
        }

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

Podobná vlákna

Prvocisla — založil myky

Prvočísla -Pascal — založil El97za

Kod prvocisla — založil robin

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

Prvocisla v intervalu — založil zemlra

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ý