Java - prvočísla, prohozrní výstupu – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Java - prvočísla, prohozrní výstupu – Java – Fórum – Programujte.comJava - prvočísla, prohozrní výstupu – Java – Fórum – Programujte.com

 

Nib
~ Anonymní uživatel
4 příspěvky
25. 10. 2011   #1
-
0
-

Zdravím, mám napsat program, který vypíše prvočísla až do maximálního čísla, které zadá uživatel. Myslím, že jsem  program dokázal vytvořit, ale potřeboval bych, aby výstup čísel byl od nejmenšího po největší a ne naopak, jak to mám já.

tj. uživatel zadá např. 4 a můj program vypíše:
---Výsledky---
3, 2,
a já bych chtěl, aby vypsal:

---Výsledky---
2, 3,

Nevíte, prosím, jak to udělat nějak elegantně? Zdrojový kód:

/**
* @ author Nib;
*/

import java.util.*;

public class Prvocisla{
	

	public static int vstupMaxCisla(){
    Scanner sc = new Scanner(System.in);
    System.out.print("Zadej max. cislo: ");
    int cislo = sc.nextInt();
    return cislo;
	}
public static boolean jePrvocislo(int cislo){
	int pomocna = 1;
for (int j = 1; j<cislo-1; j++){
	pomocna = pomocna *( cislo%(cislo-j));
}
if (pomocna > 0){pomocna = 0;return true;}
else pomocna = 0; return false;
}

	
	
public static void vypisPrvocislo(int cislo){
	if (jePrvocislo(cislo) == true && cislo != 1){
		System.out.print(cislo+", ");}
}
	
public static void main(String[] args) {
 int cislo = vstupMaxCisla();
 int pomcislo = cislo;
	System.out.println("---Vysledky---");
	for (int i = 0; i<pomcislo;i++){

	jePrvocislo(cislo);
	vypisPrvocislo(cislo);
	cislo = cislo-1;
}
	
}}
	

Díky za pomoc! :)

Nahlásit jako SPAM
IP: 88.101.98.–
liborb
~ Redaktor
+18
Guru
25. 10. 2011   #2
-
0
-

Zahoď pomcislo a používej proměnnou z cyklu:

for (int i = 2; i < cislo;i++){
	if (jePrvocislo(i)) System.out.print(i + ", ");
}

A zbytečně testuješ, jestli je prvočíslo a pak s tím nic neděláš a znovu to testuješ při výpisu.

Nahlásit jako SPAM
IP: 78.80.52.–
Nib
~ Anonymní uživatel
4 příspěvky
25. 10. 2011   #3
-
0
-

#2 liborb
Díky, máte naprostou pravdu... Už jsem to upravil a funguje to. :)

Nahlásit jako SPAM
IP: 88.101.98.–
Nib
~ Anonymní uživatel
4 příspěvky
25. 10. 2011   #4
-
0
-

Akorát mi to po nahrazení vynechává některá prvočísla: např.: 23, 29 atd...
Nechápu proč...

 


import java.util.*;

public class Prvocisla{
	

	public static int vstupMaxCisla(){
    Scanner sc = new Scanner(System.in);
    System.out.print("Zadej max. cislo: ");
    int cislo = sc.nextInt();
    return cislo;
	}
public static boolean jePrvocislo(int cislo){
	int pomocna = 1;
for (int j = 1; j<cislo; j++){
	pomocna = pomocna *( cislo%(cislo-j));
}
if (pomocna > 0){pomocna = 0;return true;}
else pomocna = 0; return false;
}

	
	
public static void vypisPrvocislo(int cislo){
	for (int i = 2; i < cislo;i++){
			if (jePrvocislo(i)) System.out.print(i + ", ");
	}}
	
public static void main(String[] args) {
 int cislo = vstupMaxCisla();
	System.out.println("---Vysledky---");
	jePrvocislo(cislo);
	vypisPrvocislo(cislo);

	
}}
	
Nahlásit jako SPAM
IP: 88.101.98.–
liborb
~ Redaktor
+18
Guru
25. 10. 2011   #5
-
0
-

Tak se podívám na test prvočísla:

public static boolean jePrvocislo(int cislo)
{
	int pomocna = 0;
	
	for (int j = 2;j < cislo - 1;j++) {
		if ((cislo % j) == 0) pomocna++;
	}


	if (pomocna > 0) return(false);
	else return(true);
}

A trocha teorie k tomu (poslední příklad). No a volání jePrvocislo(cislo); před vypisPrvocislo(cislo); je naprosto zbytečné.

Nahlásit jako SPAM
IP: 78.80.52.–
Nib
~ Anonymní uživatel
4 příspěvky
25. 10. 2011   #6
-
0
-

#5 liborb
Tak jsem ten test prvočísla předělal a výsledky jsou pořád stejný...

Například pro maxCislo 50:

2, 3, 5, 7, 11, 13, 17, 19, 37, 41, 47,

Opět... od 20 začnou záhadně chybět čísla, který končí 3 a 9;

Nahlásit jako SPAM
IP: 88.101.98.–
Tchibo0
Návštěvník
25. 10. 2011   #7
-
0
-

#6 Nib
tak skus jeste tuhle podminku:

public static boolean JePrvocislo(int i){
	int delta = i % 2 == 0 ? 1 : 2;
	for (int e = 1; e <= i / 2; e += delta) {
		if (i % e == 0 && e!=1) {
			return false;
		}
	}
	return true;
}
Nahlásit jako SPAM
IP: 109.80.248.–
Tchibo
KIIV
~ Moderátor
+43
God of flame
25. 10. 2011   #8
-
0
-

mimochodem staci jet od 2 do i*i < cislo  a skoncit jakmile narazis na prvni delitelnost tj.  (cislo % i) == 0

tj neco jako:

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


EDIT: opravena spatna podminka:  i*i < cislo

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Tchibo0
Návštěvník
25. 10. 2011   #9
-
0
-

#8 KIIV
taky krasny reseni ale podminka neni uplne spravne "i*i < cislo" vyhodi i jako prvocislo 9ku "i*i <= cislo" uz funguje skvele

Nahlásit jako SPAM
IP: 109.80.248.–
Tchibo
KIIV
~ Moderátor
+43
God of flame
25. 10. 2011   #10
-
0
-

proto sem to v kodu taky opravil

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Tchibo0
Návštěvník
25. 10. 2011   #11
-
0
-

vsim sem si ale az sem to odeslal

Nahlásit jako SPAM
IP: 109.80.248.–
Tchibo
KIIV
~ Moderátor
+43
God of flame
25. 10. 2011   #12
-
+1
-
Zajímavé

jasny, u toho se asi nezobrazuje novej prispevek...

kazdopadne to bude velice vyrazne rychlejsi nez prochazet uplne vsechny cisla vzdy... treba pro 1000000 by stacilo projit cisla do 1000.... (nicmene veskutecnosti skonci uz u cisla 2) ... az k te odmocnine se dostane jen u prvocisel a v nekterejch pripadech, kdyz to budou druhe mocniny prvocisel...

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sleepy0
Stálý člen
1. 11. 2011   #13
-
0
-

Ja by som to robil bez dalsej metody jePrvocislo, lebo jej funkcnost vies pohodlne nahradit jednou premennou vo for cykle.
To KIIV: este by sa dal usetrit cas na tom mat tabulku prvocisel a testovat len delitelnost nimi.

Toto by malo bezat:

class PrimeNumber
{
	int[] pNum;
	int n = 0;
	
	public static void main ( String[] args )
	{
		PrimeNumber pn = new PrimeNumber();
		
		pn.getPrimeNumbers (10);
		
		pn.printPrimeNumbers ( );
	}
	
	public PrimeNumber ( ){
		pNum = new int[100];
	}
	
	public void getPrimeNumbers ( int max )
	{
		boolean isPNum; 
		for ( int sPNum = 2; sPNum < max; sPNum++ )
		{
			isPNum = true; //defaultne su vsetky prvocisla a potom len preverujes
			for ( int j = 0; pNum[j]*pNum[j] <= sPNum && j<n; j++ )	// to j<n je tam kvoli prvocislu 2 ktore nieje riesenim napr. max = 1 a max =0 a max = Z- a pNum[j]^2 <= sPNum je inspirovane KIIV-om a Tchibo -m
				isPNum &= (sPNum % pNum[j]!=0);	//nahrada za metodu jePrvocislo()
			if ( isPNum )
			{
				if ( n >= pNum.length ) expandArray (); // Zabrani indexOutOfBounds Exception
				pNum[n] = sPNum;
				n++;
			}
		}
	}
	
	public void printPrimeNumbers ( )
	{
		System.out.println ( "Prvocisiel je: " +n );
		for ( int i =0; i < n; i++ ) System.out.println (pNum[i]);
	}
	
	public void expandArray ( )
	{
		int tmp[] = pNum;
		
		pNum = new int[tmp.length + 200];
		
		System.arraycopy ( tmp, 0, pNum, 0, tmp.length );
	}
}
Nahlásit jako SPAM
IP: 213.215.67.–
sleepy0
Stálý člen
1. 11. 2011   #14
-
0
-

#13 sleepy
tento for ciklus treba nahradit:

for ( int j = 0; pNum[j]*pNum[j] <= sPNum && j<n; j++ )

za

for ( int j = 0; pNum[j]*pNum[j] <= sPNum && j<n && isPNum; j++ )

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

Podobná vlákna

Prvočísla - JAVA (cyklus while,for) — založil Georgiy Pastukhov

Poradie vystupu — založil h4ck3r1

Prvocisla — založil myky

SQL - kopírovaní výstupu — založil TomTom

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ý