# Armstrong zahl



## Guest (16. Nov 2008)

Grüße, also ich bin totaler neuling in Java.
Wir sollen ein code der überprüft ob eine Zahl eine Armstrong Zahl ist modifizieren



> Eine Armstrong-Zahl ist eine Zahl , bei der die Summe der einzelnen Ziffern, die jeweils mit der Anzahl der Ziffern der Zahl potenziert wird, gleich der Zahl ist
> 
> wie z.B.: 153 = 1³+5³+3³


ok der vorgegebene code ist

```
public class ArmstrongTest {
    public static void main (String args[]) {
	int zahl = Integer.parseInt(args[0]);

	if (zahl <= 0) {
	    System.out.println("Nur positive Argumente erlaubt!");
	    return; // bedeutet hier: sofort stoppen!
	}
	// Doch bis hier gekommen? D.h. kein Stop, also weiter:
	int gemerkt; 
	gemerkt = zahl; // aktuellen Wert f. spaeteren Vergleich merken
	int summe;
	summe = 0;
	int ziffer; 
	do {
	    ziffer = zahl % 10; // letzte Ziffer
	    summe = summe + ziffer*ziffer*ziffer;
	    zahl = zahl/10; // letzte Ziffer weg, da ganzzahlige Div.
	} while (zahl > 0); // Achtung: Semikolon nicht vergessen!!
	if (summe == gemerkt)
	    System.out.println("Das ist eine Armstrong-Zahl.");	 
	else
	    System.out.println("Das ist keine Armstrong-Zahl.");
    }
}
```

so erstma ne frage, ist da kein fehler vom Prof? da steht ja 
 summe = summe + ziffer*ziffer*ziffer;
also macht er ja immer hoch 3 egal wie viel ziffern die eingebene Zahl hat, eigentlich müsste es irgendwie die potenz der anzahl der ziffern sein, leider habe ich keine Ahnung wie ich das mache, wie sieht denn der befehl für potenz aus? ist es einfach Ziffer^potenz oder is es dieses exp(potenz) aber wie schreib ich das dann Ziffer exp(potenz)...
Habe wirklich keine Idee ^^.

Und die eigentliche Aufgabe ist das er alle Armstrong zahlen von 0 bis (eingegebene Zahl) auflisten soll, aber erstma will ich mich ans erste Problem wagen.

wenn wer tipps hätt wär super


----------



## Marco13 (16. Nov 2008)

Jo, das stimmt IMHO erstmal nur für dreistellige Zahlen. Für die Potenz:

int potenz = (int)Math.pow(basis, exponent);

Die Anzahl der Stellen einer Zahl ist
int stellen = (int)Math.floor(Math.log(zahl)/Math.log(10))+1;
wenn ich mich nicht irre.

Und für die Auflistung aller Arbstrong-Zahlen: Mach' dir eine Methode
private static boolean isArmstronNumber(int n)
die kannst du dann in einer Schleife aufrufen.


----------



## Gast (17. Nov 2008)

ok das mit dem exponenten hab ich hinbekommen und sieht jetzt so aus

```
public class ArmstrongTest2 {
    public static void main (String args[]) {
	int zahl = Integer.parseInt(args[0]);

	if (zahl <= 0) {
	    System.out.println("Nur positive Argumente erlaubt!");
	    return; // bedeutet hier: sofort stoppen!
	}
	// Doch bis hier gekommen? D.h. kein Stop, also weiter:
	int gemerkt; 
	gemerkt = zahl; // aktuellen Wert f. spaeteren Vergleich merken
	int summe;
	summe = 0;
	int ziffer; 
	int stellen = (int)Math.floor(Math.log(zahl)/Math.log(10))+1; 
	do {
	    ziffer = zahl % 10; // letzte Ziffer
	int potenz = (int)Math.pow(ziffer, stellen);
	    summe = summe + potenz;
	    zahl = zahl/10; // letzte Ziffer weg, da ganzzahlige Div.
	} while (zahl > 0); // Achtung: Semikolon nicht vergessen!!
	if (summe == gemerkt)
	    System.out.println(summe);	 
	else
	    System.out.print("Keine Armstrong Zahl");
    }
}
```
aber das mit eigener Methode machen, grml das mein 2ter tag wo ich java mache und verstehe das net wirklich, ich weis einfach net was damit gemeint ist


----------



## Gast (17. Nov 2008)

also ich denk mir ja das ich um die do while schleife noch ne do while schleife packe und gemerkt = gemerkt - 1 ist wenn die innere while schleife fertig is. dachte so 
} while (zahl > 0); // Achtung: Semikolon nicht vergessen!!
      gemerkt = gemerkt - 1;
   if (summe == gemerkt)


----------



## Gast (17. Nov 2008)

also ich denk mir ja das ich um die do while schleife noch ne do while schleife packe und gemerkt = gemerkt - 1 ist wenn die innere while schleife fertig is. dachte so 
} while (zahl > 0); // Achtung: Semikolon nicht vergessen!!
      gemerkt = gemerkt - 1;
   if (summe == gemerkt);

leider geht es nicht da steht dann unendlich oft 153 oder Keine Armstrong Zahl ^^


----------



## Bloodsight (17. Nov 2008)

so sorry für den doppelpost, hab mich mal angemeldet, also ich habs fast so weit sieht jetzt so aus

```
public class ArmstrongTest2 {
    public static void main (String args[]) {
	int zahl = Integer.parseInt(args[0]);

	if (zahl <= 0) {
	    System.out.println("Nur positive Argumente erlaubt!");
	    return; // bedeutet hier: sofort stoppen!
	}
	// Doch bis hier gekommen? D.h. kein Stop, also weiter:
	int gemerkt; 
	gemerkt = zahl; // aktuellen Wert f. spaeteren Vergleich merken
	int summe;
	summe = 0;
	int ziffer; 
	int stellen = (int)Math.floor(Math.log(zahl)/Math.log(10))+1; 
	do {
	do {
	    ziffer = zahl % 10; // letzte Ziffer
	int potenz = (int)Math.pow(ziffer, stellen);
	    summe = summe + potenz;
	    zahl = zahl/10; // letzte Ziffer weg, da ganzzahlige Div.
	} while (zahl > 0); // Achtung: Semikolon nicht vergessen!!
	if (summe == gemerkt)
	    System.out.println(summe);
	gemerkt = gemerkt - 1;
	summe = 0;
	zahl = gemerkt;
        stellen = (int)Math.floor(Math.log(zahl)/Math.log(10))+1; 
	} while (gemerkt > 0);
    }
}
```
es funktioniert so weit, ich glaub da gibts nix mehr zu verbessern aber wenn wer was findet freu ich mich über tipps. Aber sonst vielen dank, hat mir extrem geholfen diese befehle da oben 

edit: ok ich hab nen problem gefunden, bei extrem hohen zahlen dauerts ewig zu rechnen, aber das kann man wohl kaum verhindern? oder wie soll der schnell 1millarde zahlen überprüfen ^^

edit2_ zum glück muss ich nich noch am ende was machen das er sagt es gibt keine Armstrong zahl in dem Bereich, weil ja die 1 schon eine ist und das die immer dabei ist, weil negative zahlen ja net genommen werden


----------



## Marco13 (17. Nov 2008)

Jo, ein bißchen aufgeräumt

```
// Von [url]http://www.java-forum.org/de/viewtopic.php?t=78104&highlight=&sid=be65fb7e0567a3b2ced4df54add5f8d0[/url]

// Siehe auch [url]http://www.research.att.com/~njas/sequences/A005188[/url]

public class ArmstrongTest2
{
    public static void main(String args[])
    {
        int zahl = 100000; //Integer.parseInt(args[0]);

        if (zahl <= 0)
        {
            System.out.println("Nur positive Argumente erlaubt!");
            return; // bedeutet hier: sofort stoppen!
        }
        for (int i=0; i<=zahl; i++)
        {
            if (isArmstrongNumber(i))
            {
                System.out.println("Zahl "+i+" ist eine Armstrong-Zahl");
            }
            else
            {
                //System.out.println("Zahl "+i+" ist keine Armstrong-Zahl");
            }
        }
    }

    private static boolean isArmstrongNumber(int eingabeZahl)
    {
        int zahl = eingabeZahl;
        int stellen = (int) Math.floor(Math.log(zahl) / Math.log(10)) + 1;
        int summe = 0;
        do
        {
            int ziffer = zahl % 10; // letzte Ziffer
            int potenz = (int) Math.pow(ziffer, stellen);
            summe = summe + potenz;
            zahl = zahl / 10; // letzte Ziffer weg, da ganzzahlige Div.
        }
        while (zahl > 0); // Achtung: Semikolon nicht vergessen!!
        return summe == eingabeZahl;
    }
}
```


----------

