# Ermitteln aller perfekten Zahlen



## Pupsicat (20. Okt 2010)

Hi Leutz,

versuche schon den halben Tag eine vollkommene Zahl zu bestimmen.
Vollkommene Zahl (auch perfekte Zahl) = Sie ist genauso groß wie die SUmme ihrer positiven
echten Teiler (außer sich selbst).
Z.B. 1+2+3 = 6
Formel: 2(hoch n-1)*(2 (hoch n) - 1)
bisher habe ich folgendes:


```
public static void main(String[] args) {

		double x = 2;
		double result;
		for (int i=1;i<=100;i++){
			
			
			result= Math.pow(x,i-1)*(Math.pow(x,i)-1);
			
			System.out.println("result "+result); //Ausgabe zu Testzwecken
		}
		
		

	}
```


In der Ausgabe tauchen die perfekten Zahlen auf. Jetzt muss ich nur noch die Ausgabe auf dies Zahlen reduzieren. Mir kan gerade die Idee mit einer zweiten verschachtelten for und dem Modulo.
Weiss nur noch nicht wie ich das umsetzen soll.

Bitte keine Vollständigen Lösungen! Nur Lösungshinweise!


----------



## XHelp (20. Okt 2010)

Du brauchst nur zu prüfen, ob 
	
	
	
	





```
Math.pow(2d,i)-1
```
 eine Primzahl ist...


----------



## Pupsicat (20. Okt 2010)

nicht den result?


----------



## Gast2 (20. Okt 2010)

Ein Produkt zweier Zahlen (beide größer 1) kann keine Primzahl sein. Ne Prüfung würde da keinen sinn machen


----------



## XHelp (20. Okt 2010)

eine perfekte Zahl ist ja keine Primzahl. Alleine schon, weil die Summe der echten Teiler einer beliebigen Primzahl immer 1 ist.
Im Grunde musst du ja jetzt prüfen, ob die vermultich perfekte Zahl auch wirklich perfekt ist.
Das kannst du entweder:
in dem du alle echten Teiler aufsummierst: schleife von j=1 bis result-1: wenn result%j==0, dann ist das ein Teiler.
Aber ich glaub mich zu erinnern, dass die Euklidische Formel aufgeht, wenn 
	
	
	
	





```
Math.pow(x,i)-1
```
 eine Primzahl ist. Da kannst du es dann mit Miller-Rabin oder so überprüfen. Es könnte ggf. effizienter bei größeren Zahlen sein.


----------



## Pupsicat (20. Okt 2010)

Ich habe eine Denkblokade:

```
public static void main(String[] args) {

		double x = 2;
		double result;
		double rest;
		for (int i=1;i<=100;i++){
			result= Math.pow(x,i-1)*(Math.pow(x,i)-1);
			
			for(int j=1;j<=result-1;j++){
				if((result % j) == 0)
				System.out.println("ist echter Teiler ");
				else System.out.println("kein Teiler");
			}
			//System.out.println("result "+result); //Ausgabe zu Testzwecken
		}
		
		

	}
```

Ich weiss nicht recht ob der Gedanke mit der Verschachtelten Schleife so richtig ist.
Wo ist mein Fehler????:L


----------



## XHelp (20. Okt 2010)

Passt doch alles. Du am besten geschweifte Klammer verwenden und summieren nicht vergessen


----------



## Pupsicat (20. Okt 2010)

Ist ne Endlosschleife!!!


----------



## XHelp (20. Okt 2010)

Ist es nicht
Die Zahlen sind ja auch etwas größer, deswegen kommt es dir nur so vor.


----------



## Pupsicat (20. Okt 2010)

Ich hab Ihn jetzt laufen lassen, der hört nicht auf.


----------



## XHelp (20. Okt 2010)

dann mach die sysouts weg, setzt die Summe rein, überprüf nach der inneren Schleife ob summe==result ist und wenn ja, gibt "summe" aus, ansonsten gar nichts... und dann lass es laufen.


----------



## Pupsicat (20. Okt 2010)

Ich hab Total die Denkblokade!;(

Kannst du bitte mein Code Ergänzen?
Danke!


Ich wollte zwar keine Lösung aber heute raff ich es nicht mehr!


----------



## XHelp (20. Okt 2010)

```
double x = 2;
double result;
for (int i = 1; i <= 100; i++) {
	result = Math.pow(x, i - 1) * (Math.pow(x, i) - 1);
	System.out.println("DEBUG: "+i); //damit du siehst, dass es keine endlosschleife ist.
	int sum = 0;
	for (int j = 1; j <= result - 1; j++) {
		if ((result % j) == 0) {
			sum += j;
		}
	}
	if (sum == result) {
		System.out.println(sum);
	}
}
```


----------

