# Teiler einer Zahl ermitteln



## Beginner09 (9. Nov 2009)

Hallo,

ich bin gerade damit beschäftigt eine Methode zu schreiben, welche mir alle möglichen Teiler einer Zahl ausgibt.


```
public String teilerErmitteln(int zahl)
{
        int i = 1; //Erster Teiler
        int teiler;
        if(i<=a)
        {
	while(a%i == 0)
	{
	teiler = a/i;
	System.out.println(teiler);
	i++;
	}//while
        }//if
        else
        {
	return "Die Zahl muss mindestens 1 betragen!";
        }
```

Nun bekomme ich aber bspw. bei der Zahl 4 die Teiler 4 und 2 ausgegeben. Soweit richtig. Es fehlt jedoch der Teiler 4.
Liegt es daran, dass bei dem Teiler 3, welcher nach 2 (Ergebnis = 2) erreicht wird, der else-Teil der if-Abfrage durchlaufen wird und es danach nicht wieder nach oben zur while-Schleife springt?

MfG,
Jürgen


----------



## javimka (9. Nov 2009)

was ist das "a" ?


----------



## Beginner09 (9. Nov 2009)

Sorry, a ist die vom Benutzer eingegebene Zahl.

In meiner main-Methode wird das deklariert.


----------



## SlaterB (9. Nov 2009)

> bekomme ich aber bspw. bei der Zahl 4 die Teiler 4 und 2 ausgegeben. Soweit richtig. Es fehlt jedoch der Teiler 4.

wie nun, ist 4 dabei oder nicht?

----

> else-Teil der if-Abfrage durchlaufen wird und es danach nicht wieder nach oben zur while-Schleife springt?

selbstverständlich wird danach nicht magisch zurückgesprungen, das kann man doch klar erkennen?
aber der else-Fall wird doch sicher nicht durchlaufen wenn a > 1 sein sollte 

----

der Parameter zahl wird ignoriert

-------

> while(a%i == 0)

ist eher schlecht, 
prüfe doch für ein Beispiel wie 4 und alle Zahlen 1 bis 4 was da als % rauskommt,


----------



## javimka (9. Nov 2009)

das else wird nicht durchlaufen, wenn i kleiner oder gleich a ist.
Ich zweifle etwas daran, dass dieses Programm korrekt läuft. Denn du gehst nur solange durch die while-Schleife und druckst Teiler, wie ein Teiler nach dem anderen gefunden werden. Sobald ein i auftritt, das a nicht teilt, springst du aus der Schleife raus, obwohl grössere i noch Teiler sein könnten.
Ich würde eine for Schleife machen und darin eine if-Abfrage, ob i ein Teiler ist oder nicht.


----------



## Leroy42 (9. Nov 2009)

Beginner09 hat gesagt.:


> Sorry, a ist die vom Benutzer eingegebene Zahl.


Und was soll dann die Variable teiler bringen, wenn doch i schon die möglichen Teiler durchläuft? ???:L


----------



## Leroy42 (9. Nov 2009)

```
for (int teiler=1; teiler <= a; ++teiler)
    if (a%teiler == 0)
        System.out.println(teiler);
```

...und übrigens: Wass soll denn der übergebene Parameter *zahl* darstellen?

Schon recht merkwürdig...


----------



## Beginner09 (9. Nov 2009)

Teiler ist die Variable in der ich die eigentliche Division vornehme (a durch i) und mit der ich anschließend die Teiler ausgebe [System.out.println(teiler)].

Ein wenig Verständnis bitte für mein Unwissen. Ich beschäftige mich erst 4 Wochen mit JAVA.


----------



## Leroy42 (9. Nov 2009)

Beginner09 hat gesagt.:


> Ein wenig Verständnis bitte für mein Unwissen. Ich beschäftige mich erst 4 Wochen mit JAVA.



Schon aber das hat nichts damit zu tun daß wenn *i* ein Teiler ist gleichzeitig *a/i* auch ein Teiler ist


----------



## Beginner09 (11. Nov 2009)

M. H. einer if-Abfrage in einer while-Schleife habe ich das, für mich große Problem, endlich lösen können.
Danke für die Anstöße.

Nun möchte ich die ermittelten Teiler in einem array abspeichern.

Ich habe getreu meinem Handbuch und den Internetrecherchen eine Variable für das Array (ergebnis) unter public class zahl deklariert (_private static int[] ergebnis;_). Im Konstruktor lasse ich dann ein neues Array (ergebnis) jeweils entstehen (_int[] ergebnis = new int[2000];_).

Soweit so gut. Nun stoße ich aber beim Ablegen meiner Werte in dem Array 'ergebnis' auf Probleme. Diese sollen nun ja nicht mehr innerhalb der while-Schleife ausgegeben, sondern im - wie gesagt - Array 'ergebnis' abgelegt werden.
Realisieren wollte ich das hierüber: '_ergebnis'. "i" stellt hierbei den Teiler dar, welcher im Array abgelegt werden soll.

Der Compiler liefert mir aber leider aus, dass es sich dabei ('ergebnis') um kein Statement handelt. Nun stehe ich wieder ein wenig ratlos da.

MfG,
Jürgen_


----------



## SlaterB (11. Nov 2009)

ergebnis[irgendein Index] = irgendein Wert;


----------



## Beginner09 (11. Nov 2009)

Entschuldigung, die Stelle habe ich überlesen. Aber Danke.


```
public static void teilerErmitteln(int a) //a gleich zu prüfende Zahl
    {
        int i = 1;
        while(i<=a)
        {
            if(a%i == 0)
            {
                [B]ergebnis[0] = i;[/B]
            }//if
            i++;
        }//while
    }//teilerErmitteln
```

Über meine main-Klasse rufe ich nun diese Methode der Klasse 'zahl' auf (*zahl.teilerErmitteln(a)*).

Beim Ausführen der main-Klasse läuft bis zu der Prüfung dieser Methode aus der Klasse 'zahl' teilerErmitteln(a) alles glatt. An dieser Stelle hapert es dann aber und ich bekomme die Fehlermeldung "NullPointException" ausgeliefert mit Verweis auf meinen Programmabschnitt '*ergebnis[0] = i;*' in der Klasse zahl / Methode 'teilerermitteln'.

Wie kann ich dies beheben?

MfG,
Jürgen


----------



## SlaterB (11. Nov 2009)

ergebnis zu nicht null machen, ergo ein Array anlegen

wenn du jetzt sagst das du das schon hast, dann zur Abkürzung: vielleicht falsch/ woanders,
immer möglichst vollständigen Code posten


----------

