Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Problemen met java, som van priemgetallen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor school moeten we een opdracht afmaken, waar ik maar niet van af geraak omdat het mij simpelweg niet lukt (ik ben dan ook nog maar een beginner). De opdracht is:

Schrijf een programma dat de som van de priemgetallen gelegen in een interval (]m,n[)
berekent. Indien er geen priemgetal in het bereik ligt, is het resultaat 0.
Merk op dat m en n strikt positieve natuurlijke getallen zijn die maximaal 1 miljoen bedragen.
De eerste lijn van de invoer bevat het aantal testgevallen N, dus het aantal intervallen dat we gaan onderzoeken. Daarna volgens N lijnen, met op elke lijn 2 waarden gescheiden door een spatie: eerst m en daarna n waarbij m kleiner is dan n.

bijvoorbeeld:
Input:
3
14 20
24 26
40 100

Output:
36
0
863

Nu, moest het gewoon priemgetallen berekenen zijn, zou het wel lukken (doe ik ongeveer analoog met solution 1 in: http://stackoverflow.com/...-first-1000-prime-numbers). Ik denk dat ik arrays moet gebruiken, gezien de prof het aantal testgevallen eigenlijk zeer groot kan laten worden, maar ik heb geen idee hoe ik die arrays moet gebruiken in de code om tot een oplossing te komen, ik hoop dat een mede tweaker mij een voorbeeld kan geven waardoor ik er wijs uit geraak, het zou een zeer aangenaam (laat) kerstcadeautje zijn :)

groetjes en dank bij voorbaat,
Dries Bauwens

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wat heb je zelf al bedacht, en waar loop je tegenaan? Want als je weet hoe je priemgetallen kan berekenen is het natuurlijk een vrij eenvoudige opgave ( Pseudocode: )

code:
1
2
3
4
5
6
7
var resultaat = 0;
for i tussen n en m
{
    if(IsPriemGetal(i))
        resultaat += i;
}
return resultaat;

[ Voor 3% gewijzigd door Woy op 30-12-2014 14:00 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Een priemgetal bepalen tussen twee waarden, is geen probleem. Het probleem zit hem in het aantal keer dat het programma zichzelf moet herhalen als het ware, ik weet niet hoe ik dat stuk moet programmeren.

Als de gebruiker bijvoorbeeld als eerste getal 3 ingeeft, en dan 3 reeksen van getallen, hoe kan ik programmeren dat het programma de 3 reeksen van getallen afzonderlijk onderzoekt opzoek naar priemgetallen en hun som?

Verwijderd

[b][message=43486507,noline]
code:
1
2
3
4
5
6
for i tussen n en m
{
    if(IsPriemGetal(i))
       return 1;
}
return 0;
Je kunt beter returnen zodra je weet dat je een priemgetal bent tegengekomen. Dat gebeurt normaal gesproken zeer snel, er zijn niet zoveel lange reeksen opeenvolgende getallen waarin geen priem zit.
Niet goed de opdracht gelezen :|

Verder kun je nog beter optimaliseren door alleen oneven getallen af te gaan, en als 2 binnen het bereik ligt kun je meteen 1 returnen die erbij optellen.

[ Voor 6% gewijzigd door Verwijderd op 30-12-2014 14:17 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je kan je programma gewoon opdelen in delen ( classes/methodes ).

code:
1
2
3
4
5
6
7
8
9
var aantalOpgaven; //Lees het aantal regels dat je moet verwerken.
for(i = 0; < aantalOpgaven; i++)
{
    var n,m; //Lees de juiste waardes

    var resultaat = CalculateSumPrimeNumbers(n,m);

    Write( resultaat );
}


CalculateSumPrimeNumbers is dan een methode die twee parameters heeft en ongeveer hetgeen doet wat ik in mijn vorige post had.

Mocht je nog tegen problemen aanlopen dan zou ik je willen uitnodigen om een klein stukje code te plaatsen wat je nu hebt, en aangeeft waar het niet wil lukken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op dinsdag 30 december 2014 @ 14:15:
[...]

Je kunt beter returnen zodra je weet dat je een priemgetal bent tegengekomen. Dat gebeurt normaal gesproken zeer snel, er zijn niet zoveel lange reeksen opeenvolgende getallen waarin geen priem zit.
Verder kun je nog beter optimaliseren door alleen oneven getallen af te gaan, en als 2 binnen het bereik ligt kun je meteen 1 returnen.
Die methode moet de sommatie van alle priemgetallen binnen een range berekenen, dus jouw voorbeeld doet heel wat anders ;)

De IsPriemGetal moet natuurlijk zo snel mogelijk returnen ;)
Verder kun je nog beter optimaliseren door alleen oneven getallen af te gaan
Natuurlijk er zijn nog wel meer optimalisaties mogelijk, maar dat lijkt mij niet het belangrijkste op dit moment voor de TS ;)

[ Voor 14% gewijzigd door Woy op 30-12-2014 14:19 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Optimaliseren is op deze moment niet echt een probleem, een werkend programma krijgen wel :)
Op deze moment werkt er eigenlijk bijna niks en ga ik mij focussen op mijn andere vakken (ik zit in de blokperiode), het is spijtig van die bonuspunten, ik kon ze waarschijnlijk goed gebruiken, maar ja, het is het einde van de wereld niet en er zijn andere vakken die ook nog wat aandacht vereisen :) alleszins, merci voor de hulp (die verbazingwekkend snel was trouwens), als iemand trouwens een goede site of dergelijke weet ivm leren programmeren, stuur gerust door, ik heb aan de lessen niet veel gehad, en aan de prof haar cursus nog minder

Groetjes
Dries

[ Voor 15% gewijzigd door Verwijderd op 30-12-2014 15:51 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Sorry, maar dingen meerdere keren doen is simpelweg een for-loop, en die heb je zeker in je cursusstof gehad. Het feitelijke probleem hier is dat je simpelweg niet zelf de moeite hebt gedaan om je probleem te vergelijken met de Java constructies die je hebt geleerd.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
For lussen ed ken ik al, en kan ik schrijven, daar ligt het probleem niet (als ik terugkijk naar wat ik schreef, snap ik de verwarring). Maar zoals ik in mijn originele vraag zei, ligt het probleem hem bij de arrays, het lukt mij niet om de arrays te gebruiken om de priemgetallen te berekenen, meer bepaald om waarden die in de array staan als grenswaarden te gebruiken, en dat is iets dat niet in de cursus staat.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik zie nog steeds geen enkele reden waarom je arrays nodig zou hebben :?, en als dat al het probleem zou zijn dan zou je toch een stukje code moeten kunnen laten zien waar je vast loopt?

Schrijf eerst eens gewoon stap voor stap op papier uit wat je wil doen, die beschrijving kan je vaak redelijk eenvoudig omzetten in java code.

[ Voor 20% gewijzigd door Woy op 30-12-2014 17:35 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Ik heb al een opbouw op papier staan, anders geraak ik echt nergens, programmeren ligt me niet zo :/
En de reden dat ik denk arrays nodig te hebben, is dat in theorie de gebruiker bij aantal intervallen (N) bv 500 kan inlezen, en dan moet je zorgen dat je 500 keer afwisselt tussen onder en bovengrens, en je kan toch niet op voorhand 1000 verschillende ...=scanner.nextInt(); staan hebben. Dus denk ik een array nodig te hebben met N rijen en 2 kolommen, met kolom 1 steeds de ondergrens, en 2 de bovengrens, of ben ik daar dan zo volledig fout in? :)

  • jlrensen
  • Registratie: Oktober 2000
  • Laatst online: 22-10 22:35

jlrensen

plaatjes vullen geen gaatjes

Dit lijkt me een mooie gelegenheid om de Zeef van Eratosthenes te implementeren (http://nl.wikipedia.org/wiki/Zeef_van_Eratosthenes). Maak een lijst van de getallen binnen het bereik, gooi de veelvouden van priemgetallen eruit en tel de rest op.

Men moet het denken bijbrengen, niet wat al gedacht is. ~C. Gurlitt


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op dinsdag 30 december 2014 @ 17:45:
is dat in theorie de gebruiker bij aantal intervallen (N) bv 500 kan inlezen, en dan moet je zorgen dat je 500 keer afwisselt tussen onder en bovengrens, en je kan toch niet op voorhand 1000 verschillende ...=scanner.nextInt(); staan hebben.
Je kan toch gewoon in een loop hetvolgende doen

code:
1
2
3
4
5
6
7
var n = LeesN();
for(i=0; i<n; i++) 
{
    var interval = LeesIntervalRegel();
    var resultaat = BerekenWaarde(interval);
    SchrijfResultaat(resultaat);
}
Dus denk ik een array nodig te hebben met N rijen en 2 kolommen, met kolom 1 steeds de ondergrens, en 2 de bovengrens, of ben ik daar dan zo volledig fout in? :)
Dat is ook een mogelijke oplossing, maar wat is je probleem daar dan mee?
Java:
1
2
int numRegels = LeesInt();
int[][] myArray = new int[numRegels][2];

Kortom: Wees wat concreter, met "Ik snap het niet, array's zijn moeilijk" hoef je hier niet echt hulp te verwachten ;)
jlrensen schreef op dinsdag 30 december 2014 @ 17:55:
Dit lijkt me een mooie gelegenheid om de Zeef van Eratosthenes te implementeren (http://nl.wikipedia.org/wiki/Zeef_van_Eratosthenes). Maak een lijst van de getallen binnen het bereik, gooi de veelvouden van priemgetallen eruit en tel de rest op.
Dat lijkt mij eerlijk gezegd niet zo'n goed idee als je de basis nog niet snapt. Leuk voor een vervolgopdracht ;)

[ Voor 24% gewijzigd door Woy op 30-12-2014 17:58 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1