Java Armstrong Zahlen

Status
Für weitere Antworten geschlossen.

Rayge

Lieutenant
Registriert
Dez. 2007
Beiträge
634
Hey,
wir sollen in Informatik ein Programm in Java Programmieren, dass alle Armstrongzahlen von 0 bis n ausgibt. n wird dabei von Nutzer eingegeben.
Für alle die nicht wissen was Armstrongzahlen sind:

"Armstrongzahlen sind Zahlen, deren Summe ihrer Ziffern, jeweils potenziert mit der Stellenanzahl der Zahl, wieder die Zahl selbst ergibt."

Nun habe ich ein Programm geschrieben und es tut nicht was es soll -.- Ich hab jetzt schon ewig rumprobiert, aber irgendwie tut es nie das was es soll. In de momentanen Fassung gibt es einfach nur eine 1 aus, das Programm scheint aber im Hintergrund irgendwie unendlich weiter zu laufen.
Vielleicht könnt ihr mir ja helfen meine Fehler zu finden.

Ich habe übrigens bewusst nicht Math.pow() benutzt, da wir die Potenz mit einer Schleife berechnen sollen.

Code:
class Armstrong {
    public static void main (String args[]) {
	int n = Integer.parseInt(args[0]);
	int summe;
	summe = 0;
	int ziffer; 
	
	
	for(int zahl = 1; zahl <= n; zahl++){
		int k = 0;
		int temp = zahl;
		int temp2 = zahl;
		while(temp > 0){
			temp = temp/10;
			k++;  //feststellen, wie viele Ziffern die Zahl hat
		}
		do {
		    ziffer = zahl % 10; // letzte Ziffer
			int temp3 = ziffer;
			for(int i=1; i < k; i++){
				ziffer = ziffer*temp3;  //Potenz der Ziffer berechnen
			}
			summe = summe + ziffer;
		    zahl = zahl/10; // letzte Ziffer weg, da ganzzahlige Div.
		} while (zahl > 0);
		
		if(summe == temp2){
			System.out.println(summe);
		}
		
	}
	}
}
 
zahl = zahl/10; // letzte Ziffer weg, da ganzzahlige Div. <- willst du da wirklich an deiner Zählvariable aus der for-schleife rumspielen? Das ist soweit ichs eben gesehen hab auch der Grund für den Endlosloop.
Außerdem wär ich dafür das Potenzieren in eine eigene Methode auszulagern und das Bestimmen der Länge auch, wenn ihr das schonmal gemacht habt.

@NachtkindFX
Nach dem was da oben steht: ja
 
Zuletzt bearbeitet:
Was hier stand stimmt nicht. Ist wohl schon zu spät. Ich geh schlafen. :p

PS: ja wie erwähnt ist das Verändern von zahl in der While-Schleife nicht gut, eine zusätzliche Variable stattdessen verwenden
 
Zuletzt bearbeitet:
Kann ich bestätigen. Wärs zudem nicht deutlich einfacher, die Zahl in einem String zu lassen? Mit string.length() und string.substring() kannst du dir viel von dem Code sparen.
 
Wäre es nicht einfacher mit Methoden zu arbeiten?

Also z.B. eine Methode die Prüft ob eine Zahl eine Armstrong Zahl ist und dann einfach ausgibt?

Besser und Fehlerfreier als so ein schleifen Monster.
 
Ich hab das mal programmiert und dabei folgende Methoden geschrieben:

public static int armstrongsum (int x) //Gibt die Armstrongsumme von allen ziffern ^ länge zurück
public static int getDigit (int x, int pos) //Gibt die Zahl an Stelle x zurück, ging am besten über Strings
public static int getLength (int x) //Gibt die Länge der Zahl zurück
public static int power (int x, int y) //Gibt x ^ y zurück

Damit sollte mal gut hinkommen, dann ist die Schleife in der main auch grade noch 2 Zeilen lang.
 
Zuletzt bearbeitet:
Code:
class Main3{
	public static int pow(int a, int b){
		int ret = 1;
		while(--b >= 0)
			ret *= a;
		return ret;
	}
	
	public static void main(String [] args){
		int n = Integer.parseInt(args[0]);
		
		for(int i = 0; n > 0; i++){
			int digits, val, sum = 0;
			for(val = i, digits = 0; val > 0; val /= 10, digits++);
			for(val = i; val > 0; val /= 10)
				sum += pow(val % 10, digits);
			if(sum == i){
				System.out.println(sum);
				n--;
			}
		}
	}
}
 
Zuletzt bearbeitet:
Nunja, bereits wieder etwas viele Methoden. getDigit und getLength kann man ja direkt weglassen, wenn man mit Strings arbeitet. Etwa so:

Code:
public class ArmstrongNumbers {
		
	public static void main(String[] args) {
		for(int i=1;i<=Integer.parseInt(args[0]);i++)
			if(armstrong(i)) System.out.println(i);	
	}
	
	static boolean armstrong(int in){
		//implement
	}
	
	static int power(int a, int n){
		//implement
	}
}
 
Zuletzt bearbeitet:
Klar kann man die weglassen, man kann sie aber auch einfach über Strings implementieren und auf Integer arbeiten:
Code:
   public static int getLength(int x) {
	String y = "" + x;
	return y.length();
   }
   public static int getDigit(int x, int pos) {
	   String s = "" + x;
	   return s.charAt(pos-1)-48;
   }
 
Meiner Meinung nach machen zuviele Methoden Code auch unübersichtlich. Aber das ist wohl Geschmackssache :)
 
Klar ist das wieder Geschmackssache ^^
Wenn man den Code kommentiert wirds auch langsam verständlich, außerdem ist der Wiederverwendbarkeitsgrad recht hoch, weil jede Methode nur das macht was sie soll ^^
 
Hier lesen und beachten.
Ihr seid super Jungs, nur zum lesen einfach zu bl...
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben