# Aufgabenhilfe



## SirWitan (2. Mrz 2011)

Wie immer erhalten wir von unserem Informatiklehrer Aufgaben, die wir bis zu einem bestimmten Termin bearbeiten sollen.
Heute jedoch bin ich an 2 Aufgaben nicht mehr weitergekommen, ich sitze nun schon 6 Stunden an den Aufgaben...

Ich habe noch genau bis 24 Uhr zeit ihm die Lösungen per E-Mail zu schicken...

Ich bitte wirklich um Hilfe!

Hier die 2 Aufgaben:

Aufgabe 1 (while-Schleife)
Eine natürliche Zahl n heißt perfekt, wenn n als Summe aller natürlichen Zahlen i
, durch die n ohne Rest teilbar ist, dargestellt werden kann.
Die Zahl 28 ist beispielsweise eine perfekte Zahl. Es ist 28 = 1 + 2 + 4 + 7 + 14 und 1, 2,
4, 7, 14 sind genau alle Zahlen, durch die 28 ohne Rest teilbar ist.
Schreiben Sie eine Methode, das alle perfekten Zahlen zwischen 1 und 1000 auf dem Bildschirm ausgibt.

Mein "Ansatz":


```
public static int perfekteZahl(int n) {
int summe=0;
int i=1;
while(i<1000) {
summe=summe+i;
i++;
}

return summe;
}
```

Aufgabe 2 (while-Schleifen)
Implementieren Sie eine Methode, die tabellarisch das Kapital einer jährlichen
Verzinsung mit 7% ausgibt. Die Ausgabe soll nach dem Aufruf von
verzinsung(10,1000) wie folgt erfolgen: System.out.println (" Im "+ j++ +". Jahr beträgt das Kapital " + g++);

Mein "Ansatz":


```
public static double verzinsung(int j, double n) {
double s=0;
double g=0;
while(g<n && g<j) {
j++;
s=n*1.07;
g++;

System.out.println(" Im "+ j++ +". Jahr beträgt das Kapital " + g++);

}

return s;

}
```


Von guten Ansätzen lässt sich wohl kaum reden... ich habe leider gar keinen Plan und bin mir schon fast dabei dir Haare auszureißen...


----------



## Final_Striker (2. Mrz 2011)

Bei der Aufgabe 1 solltest du es mal mit dem % Modulo-Operator probieren.

Die Aufgabe 2 verstehe ich nicht. Was ist 10, 1000, g++?


----------



## SirWitan (2. Mrz 2011)

Ich glaube der Link zu dieser Seite mahct es deutlicher für Aufgabe 2 (dort ist es Aufgabe 3) gibt es noc h eine Grafik...

http://www.frank-wetzlar.info/info11/EinfuehrungJava/Hausaufgabe20110223.pdf


----------



## dschava (2. Mrz 2011)

Die zweite Aufgabe ist recht einfach, bei der ersten muss ich nochmal überlegen



```
public class Zinsen {

	public static void main(String[] args) {
	
	verzinsung(10,1000); //Methodenaufruf
}

	public static void verzinsung(int jahreGesamt, double kapital) {
		int jahresanzahl = 0;
		while(jahresanzahl < jahreGesamt) {
			kapital = kapital * 1.07;
			jahresanzahl++;
                 System.out.println(" Im "+ jahresanzahl + ". Jahr beträgt das Kapital " + kapital + " Euro");
		}
		
	}
}
```

jahreGesamt = wielange das Kapital angelegt werden soll, ich gehe mal davon aus dass du mit Zinseszins rechnen willst...


----------



## SirWitan (2. Mrz 2011)

Vielen Dank! Die Aufgabe 3 war wohl genau so gemeint...

Kann mir jemand noch bei der 2ten Aufgabe helfen? So wie ich hörte bruacht man hier 2 while-Schleifen...


----------



## Landei (2. Mrz 2011)

(ungetestet)

```
int zahl = 1;
while(zahl <= 1000) {
   int summe = 0;
   int teiler = 1;
   while(teiler < zahl) {
       if (zahl % teiler == 0) {
           summe = summe + teiler;
       }
   }
   if (summe == zahl) {
       System.out.println(zahl + " ist perfekt");
   }
   zahl++;
}
```


----------



## SirWitan (2. Mrz 2011)

Hmm ich habe versucht es zu implementieren, aber irgendwie scheint es nicht zu funktionieren...


----------



## perfektezahe (2. Mrz 2011)

Landei hat gesagt.:


> (ungetestet)
> 
> ```
> int zahl = 1;
> ...



das summiert die Teiler aller Zahlen von 1 bis 1000, man muss es unterteilen in eine Prüfung, ob eine Zahl perfekt ist, und in die Generierung der Zahlen von 1 bis 1000.


----------



## dschava (2. Mrz 2011)

So sollte es stimmen:


```
public class PerfekteZahlen {

	public static void main(String[] args) {
		int zahl = 1;

		while (zahl < 1000) {
			zahl++;
			int summe = 0;
			for (int i = 1; i < zahl; i++) {
				if (zahl % i == 0) {
					summe = summe + i;
				}
			}
			if (zahl == summe)
				System.out.println(summe);
		}
	}
}
```


Sind allerdings nicht gerade viele Zahlen


----------



## perfektezahe (2. Mrz 2011)

SirWitan hat gesagt.:


> Hmm ich habe versucht es zu implementieren, aber irgendwie scheint es nicht zu funktionieren...



dürft ihr davon ausgehen, das alle perfekten zahlen gerade sind? gehört die 0 dazu?


----------



## SirWitan (2. Mrz 2011)

Tja schön und gut aber ich habe wirklich keinen Plan wie ;(

EDIT: Ja nur gerade Zahlen, ob die 0 dazugehört weiß ich jetzt nicht... aber man darf ja soweiso nicht durch 0 teilen also denk ich Mal eher nicht...


----------



## dschava (2. Mrz 2011)

Ich hab die Lösung doch oben schon beschrieben...

und es sind wirklich nur 3 Zahlen 


Übrigens möchte ich an dieser Stelle mal hierhin verweisen: http://www.java-forum.org/java-basics-anfaenger-themen/107642-perfekte-zahlen-errechnen.html


----------



## SirWitan (2. Mrz 2011)

Danke, aber wieso ist die Aufgabe bei dir in der main-Methode?


----------



## perfektezahe (2. Mrz 2011)

SirWitan hat gesagt.:


> Tja schön und gut aber ich habe wirklich keinen Plan wie ;(



die teiler sollen aufsummiert werden, also für jede zahl prüfen, ob sie teiler ist, und dann irgendwo zuaddieren. zum schluss prüfen, ob die summe gleich der zu prüfenden zahl ist.

siehe modulo operator.


----------



## perfektezahe (2. Mrz 2011)

14 min haste noch, alles zu prüfen und eine perfekte lösung abzuliefern ^^


----------



## dschava (2. Mrz 2011)

SirWitan hat gesagt.:


> Danke, aber wieso ist die Aufgabe bei dir in der main-Methode?



Ich hätte es auch so schreiben können:


```
public class PerfekteZahlen{
	
public static void main(String[] args) {
		perfekteZahlen();
	}

	public static void perfekteZahlen() {
		int zahl = 1;

		while (zahl < 1000) {
			zahl++;
			int summe = 0;
			for (int i = 1; i < zahl; i++) {
				if (zahl % i == 0) {
					summe = summe + i;
				}
			}
			if (zahl == summe)
				System.out.println(summe);
		}
	}
}
```

Aber bei so ner "kleinen" Aufgabe wollt ich mir die Schreibarbeit sparen 

Übringens, in vielen Fällen, besonders beim Zählen, ist eine for-Schleife wesentlich eleganter und übersichtlicher als eine while-Schleife, doch bewirkt sie haargenau das gleiche


----------



## SirWitan (3. Mrz 2011)

Phuu ich danke nochmal allen die mir geholfen haben! Ich konnte die Aufgaben in letzter Minute noch abschicken :shock:


----------



## Landei (3. Mrz 2011)

perfektezahe hat gesagt.:


> das summiert die Teiler aller Zahlen von 1 bis 1000, man muss es unterteilen in eine Prüfung, ob eine Zahl perfekt ist, und in die Generierung der Zahlen von 1 bis 1000.



Das ist Schwachfug, denn das [c]int summe = 0;[/c] steht *in* der äußeren Schleife. Ich hatte bloß vergessen, den Teiler hochzuzählen. So geht es:


```
int zahl = 1;
while(zahl <= 1000) {
   int summe = 0;
   int teiler = 1;
   while(teiler < zahl) {
       if (zahl % teiler == 0) {
           summe = summe + teiler;
       }
       teiler++; //<-----------------
   }
   if (summe == zahl) {
       System.out.println(zahl + " ist perfekt");
   }
   zahl++;
}
```


----------



## perfektezahe (3. Mrz 2011)

dschava hat gesagt.:


> Aber bei so ner "kleinen" Aufgabe wollt ich mir die Schreibarbeit sparen



in der pdf steht, alle ganzen zahlen i, 1<=i<=n/2


----------



## perfektezahe (3. Mrz 2011)

Landei hat gesagt.:


> Ich hatte bloß vergessen, den Teiler hochzuzählen.



ein hoch auf die erfindung der for-schleife


----------



## Landei (3. Mrz 2011)

perfektezahe hat gesagt.:


> ein hoch auf die erfindung der for-schleife



... die ja hier nicht verwendet werden soll, da es um while-Schleifen geht. Normalerweise wäre [c]for[/c] hier natürlich die bessere Wahl.


----------

