Springen naar inhoud

Zoeken van priemgetallen in java


  • Log in om te kunnen reageren

#1

English

    English


  • >100 berichten
  • 126 berichten
  • Ervaren gebruiker

Geplaatst op 03 mei 2011 - 12:36

Beste, ik heb onlangs dit klein programma'tje hieronder geschreven voor een wedstrijd, met als doel te bepalen welke priemgetallen men tegenkomt tussen 1 en een opgegeven getal door de gebruiker. Ik moet dit echter mondeling kunnen verdedigen voor een vaksjury en desondanks de programming "skills" er wel zijn, heb ik toch nog wat moeite om hetgeen wat ik allemaal heb geschreven echt te verwoorden. Kunnen jullie me hierbij helpen? Ik zal onder de code schrijven hoe ik het zou uitleggen ;)

import java.io.*;

class PrimeNumber {
public static void main(String[] args) throws Exception{
int i;
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter number:");
int num = Integer.parseInt(bf.readLine());
System.out.println("Prime number: ");
for (i=1; i < num; i++ ){
int j;
for (j=2; j<i; j++){
int n = i%j;
if (n==0){
break;
}
}
if(i == j){
System.out.print(" "+i);
}
}
}
}

Eerste regel zorgt ervoor dat er input kan verwerkt worden van de gebruiker die hij ingeeft via het toetsenbord, in essentie wordt de methode "io*" opgeroepen van de klasse java en deze geÔmporteerd uit de programmabibliotheek.

Vervolgens krijgen we de klassedefinitie en vervolgens wordt binnen deze klasse de main methode aangeroepen die bovendien ook controleert op fouten, zoals wanneer bijvoorbeeld een tekst of kommagetal zou worden ingegeven in plaats van een gewone integer.

Na het aanroepen van de main methode wordt de variabele i gedeclareerd die we later zullen hanteren als tellermechanisme. Ik weet dat deze declaratie evengoed in mijn for-lus zelf zou kunnen staan, maar vermits j toch buiten de for lus moet worden gedeclareerd (anders kan niet altijd op de if conditie worden gecontroleerd, heb ik ze er allebei buiten gezet.

Vervolgens wordt er een nieuw object van de klasse BufferedReader aangemaakt aan de hand van het kenteken "new" gevolgd door de naam van de klasse. Echter heb ik hier tussen haakjes ook nog een inputstreamreader aan toegevoegd die de bytes die worden gelezen via het toetsenbord omzet in karakters, om de efficiŽntie van het programma (dat vrij traag gaat zijn als we hoge getallen kiezen) te verhogen. Bovendien vinden we ook nog tussen haakjes dat deze zal inwerken op wat er ingevoerd wordt via het toetsenbord aan de hand van System.in

In de volgende regel vinden we een drukinstructie die aan de gebruiker vraagt om een getal in te geven, wat dan in feite als bovengrens zal dienen.

Vervolgens wordt op het object bf van de klasse BufferedReader de methode readLine() opgeroepen die als het ware effectief de input gaat verwerken. Om ervoor te zorgen dat er gerekend kan worden met de waarde die wordt ingegeven door de gebruiker, heb ik ook hierop de constructie Integer.parseInt() toegepast (methode parseInt() van de klasse Integer wordt opgeroepen) die ervoor zorgt dat de input String wordt omgezet in een integer en vervolgens hiervan de waarde wordt toegewezen aan de variabele num, die van het type integer is.

Vervolgens krijgen we weer een drukinstructie waaronder na het uitvoeren van de nodige berekeningen in de for lussen eronder de priemgetallen die zich tussen 1 en de opgegeven bovengrens bevinden worden afgedrukt.

Hier begint het echter lastig te worden om dit uitgelegd te krijgen. Ik zie de aritmetiek van de de forlussen wel, maar hoe zet ik dit nu net om in concrete woorden? De volgende dingen kan ik hierover nog wel aangeven:

* Break methode wordt gebruikt om een methode te "stoppen", wat enkel gaat gebeuren als de modulus van de deling 0 is (de rest is dus nul, dus we delen het getal door zichzelf in dat geval)

Het is echter al zo lang geleden dat ik die for lus constructie heb geschreven, dat ik aldus niet meer zo goed kan verwoorden hoe de dynamiek ervan loopt. Ik weet dat dit een erg lange uitleg is, maar alle hulp is echt wel welkom! :P

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 03 mei 2011 - 12:57

... om de efficiŽntie van het programma (dat vrij traag gaat zijn als we hoge getallen kiezen) te verhogen....


Dat is onzin. Het stuk dat je programma traag maakt is dat van de for-loops en dat komt nŗ de user input. De tijd om een getal van de console te lezen is verwaarloosbaar tegenover al die berekeningen die erna komen (als num groot is).


for (i=1; i < num; i++ ){
		int j;
		for (j=2; j<i; j++){
			int n = i%j;
			if (n==0){
				break;
			}
		}
		if(i == j){
			System.out.print("  "+i);
		}
	}
}

Dit is het enige interessante stuk in je code. Hier draait het hem waarschijnlijk om. Gewoon een getal lezen van de console is vrij triviaal.

De buitenste for loop gaat alle getallen af tussen 1 en de opgegeven bovengrens.
Voor elk getal dat je daar tegenkomt kijk je of het deelbaar is door een getal anders dan 1 of zichzelf.

Aan jou om uit te leggen hoe je die controle doet en hoe je vaststelt of een getal al dan niet priem is.

#3

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 03 mei 2011 - 14:02

Beste, ik heb onlangs dit klein programma'tje hieronder geschreven voor een wedstrijd,

JIJ hebt geschreven?

#4

Kravitz

    Kravitz


  • >1k berichten
  • 4042 berichten
  • Moderator

Geplaatst op 03 mei 2011 - 19:21

Verplaatst naar programmeren.
"Success is the ability to go from one failure to another with no loss of enthusiasm" - Winston Churchill





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures