2 van 3

Re: [java] lussen

Geplaatst: za 23 feb 2008, 11:11
door Ruben01
Ohja idd, het was 8128. De reden dat een milard berekenen zo lang duurt is omdat je telkes meer en meer getallen moet gaan bekijken of ze wel een deler zijn (bij een 100.000 bv moet je al 50000 keer door de while lus).
Hij is er gewoon met gestopt :D

Voor wie intresse heeft kan altijd kijken op de volgende webpagina: http://amicable.homepage.dk/perfect.htm

Re: [java] lussen

Geplaatst: za 23 feb 2008, 14:29
door Cycloon
Hij is er gewoon met gestopt :D [/url]


Waarschijnlijk omdat je int te klein is :D Probeer het ff met een long ofzo, dan zal die wel rustig verder doen :D

Re: [java] lussen

Geplaatst: za 23 feb 2008, 15:02
door EvilBro
Waarschijnlijk omdat je int te klein is
Dat denk ik niet. Een int in java is 32 bit.

Re: [java] lussen

Geplaatst: za 23 feb 2008, 15:53
door Cycloon
Dat denk ik niet. Een int in java is 32 bit.


Das wel waar, maar je spreekt hier wel over een signed int, dus schieten er maar 31 bits meer over. Je kan dus gaan tot 2 147 483 647, dus 1 miljard zou in principe moeten lukken, maar waarschijnlijk heeft ruben toch zijn nulletjes niet goed getelt? :D

Re: [java] lussen

Geplaatst: za 23 feb 2008, 15:58
door Ruben01
Das wel waar, maar je spreekt hier wel over een signed int, dus schieten er maar 31 bits meer over. Je kan dus gaan tot 2 147 483 647, dus 1 miljard zou in principe moeten lukken, maar waarschijnlijk heeft ruben toch zijn nulletjes niet goed getelt? :D
Ik heb ze wel goed getelt maar ik denk dat hij gestopt was doordat ondertussen een ander programma aan het schrijven dat ik wou testen.

Ik heb hem dan nog eens opnieuw gestart deze middag (voor alle zekerheid met 'long') maar na een uur heeft hij precies nog niks, ik ga dus maar stoppen met zoeken :D

Re: [java] lussen

Geplaatst: za 23 feb 2008, 16:07
door Cycloon
Oh, zie hier de reden waarom die gestopt is met een int:

5de perfecte getal: 33550336 (en dit is natuurlijk de overflow waar je for lus gaat stoppen).

Re: [java] lussen

Geplaatst: za 23 feb 2008, 16:29
door EvilBro
Cycloon schreef:Oh, zie hier de reden waarom die gestopt is met een int:

5de perfecte getal: 33550336 (en dit is natuurlijk de overflow waar je for lus gaat stoppen).
Leg eens uit...

Re: [java] lussen

Geplaatst: za 23 feb 2008, 16:35
door Cycloon
Leg eens uit...


Ik ben fout (ik zie het nu pas :D ), je for lus gaat gewoon door natuurlijk (al zal je while lus niet meer doorlopen worden zolang je in de negatieve waarden blijft hangen). Dan kan ik niet zo direct een reden bedenken waarom het plots is gestopt :D Het enige wat nog kan dan is dat het andere programma die Ruben draaide de VM van Java heeft afgesloten.

Re: [java] lussen

Geplaatst: ma 25 feb 2008, 00:54
door Lathander
Het stoppen van een lus ligt aan het feit dat de geheugenopslagplaats beperkt is.

En dan bedoel ik niet het feit dat een int 32-bits is...

als je een lus doet, gaan al je voorgaande stappen onthouden en dus opgeslagen worden...

We hebben er eens een demonstratie van gehad in een theorie les... Gewoon een for lus die moest door gaan met i++ te printen in de prompt to Integer.MAX_VALUE

na 36.000 ofzo liep ie vast...

zo kan je dus aantonen dat het een sechte manier van programeren is om methoden op te roepen op het einde van een andere methode en zo een nooit-eindigende lus te maken

Re: [java] lussen

Geplaatst: ma 25 feb 2008, 01:26
door Lathander
Mag m'n eigen bericht niet meer editen... grmbl...

Zelfde programma, maar dan met een dubbele for-lus. Ook een mogelijkheid

Let er natuurlijk op dat je het bestand waar je dit in plakt de juiste naam heeft...

Code: Selecteer alles

public class Perfect

{

public static void main(String[] args)

{

Input inp = new Input();

System.out.println("Geef een grenswaarde in.");

int grens = inp.readInt();

int som = 0;

for(int i = 2; i<=grens;i++)

{

som = 0;

for(int j = 1; j<i;j++)

{

if(i%j==0)

{

som +=j;

}

}

if(som==i)

{

System.out.print(som + " ");

}

}

}

}

Re: [java] lussen

Geplaatst: ma 25 feb 2008, 09:44
door EvilBro
als je een lus doet, gaan al je voorgaande stappen onthouden en dus opgeslagen worden...
Nee. Kijk maar eens naar het geheugengebruik terwijl je het volgende progamma runt:

Code: Selecteer alles

for (int i = 0; i < Integer.MAX_VALUE; i++) {

   System.out.println(i);

}
Dit programma stop ook niet bij 36.000 of zo.
zo kan je dus aantonen dat het een sechte manier van programeren is om methoden op te roepen op het einde van een andere methode en zo een nooit-eindigende lus te maken
Die situatie heeft echter helemaal niks te maken met de situatie hier. Er wordt geen methode opgeroepen aan het einde van een andere methode en er is geen oneindige lus.

Re: [java] lussen

Geplaatst: ma 25 feb 2008, 09:50
door Lathander
EvilBro schreef:Nee. Kijk maar eens naar het geheugengebruik terwijl je het volgende progamma runt:

Code: Selecteer alles

for (int i = 0; i < Integer.MAX_VALUE; i++) {

   System.out.println(i);

}
Dit programma stop ook niet bij 36.000 of zo.

Die situatie heeft echter helemaal niks te maken met de situatie hier. Er wordt geen methode opgeroepen aan het einde van een andere methode en er is geen oneindige lus.
Toch opmerkelijk, ik heriner me duidelijk een programma te zien gekregen hebben waarin gedemonstreerd werd hoe alles vastliep omdat er teveel geheugen gebruikt werd

Re: [java] lussen

Geplaatst: ma 25 feb 2008, 09:55
door EvilBro
Dat was dan gewoon een ander programma. Misschien iets in deze trant:

Code: Selecteer alles

 

public void print(int i) {

   System.out.println(i);

   if (i < Integer.MAX_VALUE) {

	  print(i+1);

   }

}

Re: [java] lussen

Geplaatst: zo 02 mar 2008, 18:51
door Ruben01
Ik heb opnieuw een probleem, het programma waarvoor ik deze topic starte was als volgt:

Lees een getal karaktergewijs. Met de methode readChar() dient karakter per karakter gelezen te worden in een herhalingslus. Bouw uitgaande van de karaktertekens de gehele waarde op. Schrijf deze waarde tenslotte als integer op het scherm.

Voorbeeld: de karaktertekens '1''2''3' worden afzonderlijk ingelezen en het gehele getal 123 wordt daaruit gevormd en getoond op het scherm nu zou ik graag willen proberen om die 123 omgekeerd weer te geven als 321.

Code: Selecteer alles

public class Oef3_4

{

public static void main (String [] args)

{

Input inp = new Input();

System.out.print("Invoer: ");

char ch; int getal=0;

/*

 *ch = inp.readchar();

 *while(ch != '\n')

 *{

 		getal= getal*10+ (int) ch - 48;

 		ch=inp.readChar();

  }

  */

  while((ch=inp.readChar()) != '\n')

   	getal = getal*10 + (int) ch -48;

  

  System.out.println("Getal: "+getal);

  

}

}
MIJN IDEE:

ik zou gebruik maken van een getal i

in mijn luse zou ik die i telken laten optellen en daarna 10^1 doen

Code: Selecteer alles

int i=-1;

i++;

i=10^i
Nu zou ik het laatste karakter dat omgezet wordt in een getal willen vermenigvuldigen met 10, 100, 1000, ... + het voorgaande getal.

Die i=-1 in hierboven zou ik zo nemen omdat de eerste keer wanneer je een getal ingeeft i gelijk moet zijn aan 0 dus -1++=0

Ik denk dat mijn idee correct is maar het omzetten in code lukt mij niet, kan er mij iemand helpen

Re: [java] lussen

Geplaatst: zo 02 mar 2008, 19:27
door EvilBro
Ik snap niet precies hoe je idee zou moeten werken. Ik kan echter wel twee andere ideeen verzinnen (twee mogelijke paden om te bewandelen). Hints die in de richting vandie ideeen zitten.

idee 1: Een String omdraaien is makkelijker dan een int omdraaien.

idee 2: 123 `mod` 10 = 3; 123 `div`10 = 12; 12 `mod` 10 = 2; 12 `div` 10 = 1; 1 `mod` 10 = 1... kijk eens naar de resultaten van de modulo's...