Palindrom Programm

HeroYui

Neues Mitglied
Hey ich habe ein Program geschrieben welches die größte Palindromzahl[z.B. 101] sucht welche aus 2 3-stelligen Zahlen erzeugt wird. Aus einem mir unerfindlichen Grund ist die ausgabe des Programmes jedoch nur die das größte palindrom 0 seie. Könntet ihr mir bitte sagen aus welchem grund dieses Ergebnis erschein? Danke!
Java:
package programme;

public class EulerP4 {
	public static void main(String[] args) {
	int k = 999;
	int l = 999;
	int z = 0;
	int u = 0;
	if (l != 0){
		z = (k * l);
		k --;
		if (k == 1){
			k = 999;
			l --;
		}
		String p1 = String.valueOf(z);
			if (isPalindrom(p1)){
				if (z>u){
					u = z;
				}
	
		}
	}
	System.out.println("Die größte Palindromische Zahl aus 2 3-Stelligen Zahlen ist: " + u);
	}
    public static boolean isPalindrom(String input)
    {
        return new StringBuffer(input.replaceAll("\\s","")).reverse().toString().equalsIgnoreCase(input.replaceAll("\\W",""));
    }
}
 
Zuletzt bearbeitet:
dieser Teil wird in deinem Beispiel nicht aufgerufen,... daher bleibt u = 0

Java:
if (isPalindrom(p1)){  //Bedingung nicht erfüllt
 if (z>u){
     u = z;
}
 
Da fehlt irgendwie eine Schleife drum herum, wenn du das Maximum ermitteln willst.

[EDIT]Achtung Spoiler: [/EDIT]

Java:
public class PalindromTest {

	public static void main(String[] args) {
		
		int k = 999;
		int l = 999;

		PalindromTest t = new PalindromTest();
		System.out.println("Das größte Palindrom ist: " +t.highestPalindrom(k, l));
	}
	
	public int highestPalindrom(int k, int l) {
		if((k/100 <= 0 || k/1000 > 0)|| (l/100 <= 0 || l/1000 > 0)) {
			throw new IllegalArgumentException("Argumente müssen 3-stellig sein.");			
		}
		
		for(int i = k*l; i >= 0; i--) {
			if(isPalindrom(i)) return i;
		}
		
		return 0;
	}
	
	private boolean isPalindrom(int p){
		return new StringBuffer(String.valueOf(p).replaceAll("\\s","")).reverse().toString().equalsIgnoreCase(String.valueOf(p).replaceAll("\\W",""));
	}
	
}
 
Zuletzt bearbeitet:
@Flown: Deinem Programm nach wäre das höchste sich aus zwei dreistelligen Faktoren zusammensetzende Palindrom 997799. Dass das ein Palindrom ist, sieht man. Aber es setzt sich leider nicht aus zwei dreistelligen Faktoren zusammen, denn 997799 = 11 * 90709.

Java:
        for(int i = k*l; i >= 0; i--) {
            if(isPalindrom(i)) return i;
        }
Du fängst zwar mit i = k*l an, aber sobald du i-- machst, ist nicht mehr sicher, dass es ganzzahlige k, l gibt, für die i = k*l gelten würde. 😉
 
Danke für die Hilfe, gelöst habe ich es nun in dem ich einfach das 1. if durch ein for austauschte.
[JAVA=9]if (l != 0){[/code]
Wurde also ersetzt durch
[JAVA=9]for (;l != 0; k--){[/code]
und um Code zu sparen wurde die Ursprüngliche z.11 gelöscht da diese in dem for enthalten ist. Der Finale code sieht also folglich so aus:
Java:
package programme;
public class EulerP4 {
	public static void main(String[] args) {
	int k = 999;
	int l = 999;
	int z = 0;
	int u = 0;
	for (;l != 0; k--){
		z = (k * l);
		if (k == 1){
			k = 999;
			l --;
		}
		String p1 = String.valueOf(z);
			if (isPalindrom(p1)){
				if (z>u){
					u = z;
				}
		}
	}
	System.out.println("Die größte Palindromische Zahl aus 2 3-Stelligen Zahlen ist: " + u);
	}
    public static boolean isPalindrom(String input)
    {
        return new StringBuffer(input.replaceAll("\\s","")).reverse().toString().equalsIgnoreCase(input.replaceAll("\\s",""));
    }
}
 
Code:
Die größte Palindromische Zahl aus 2 3-Stelligen Zahlen ist:
kann mir das jemand erklären, was damit gemeint ist? Alle Kombinationen aus zwei Zahlen, die ohne vorangestellte Ziffern jeweils aus drei Ziffern bestehen? Dann würden doch alle gleichen Zahlen schon mal ein Palindrom bilden, und die höchste Zahl wäre 999 999. Was gibts da noch zu testen?
 
Code:
Die größte Palindromische Zahl aus 2 3-Stelligen Zahlen ist:
kann mir das jemand erklären, was damit gemeint ist? Alle Kombinationen aus zwei Zahlen, die ohne vorangestellte Ziffern jeweils aus drei Ziffern bestehen? Dann würden doch alle gleichen Zahlen schon mal ein Palindrom bilden, und höchste Zahl wäre 999 999. Was muss man da noch testen?

Aus;
Java:
        z = (k * l);
schließe ich, dass mit "aus 2 3-Stelligen Zahlen" gemeint ist "ein Produkt aus 2 3-stelligen Zahlen".
 
Ok, es gibt (999-99)^2 solcher Produkte. Sollte ja nicht all zu schwer sein, die zu berechnen

Einige Zahlen lassen sich sicher auch überspringen

String.valueOf ist doch unnötig aufwändig?
 
@hüteüberhüte: Dann lass uns doch wissen, wie du es gemacht hättest! 😉

Meine Lösung sieht so aus:
Java:
	static int p4(int n) {
		int maxPalindrome = 0;
		n = (int) (Math.pow(10, n)-1);
		for (int i = n; i*i > maxPalindrome; i--)
			for (int j = i; j*j > maxPalindrome; j--)
				if (isPalindrome(String.valueOf(i*j)) && i*j > maxPalindrome)
						maxPalindrome = i*j;
		return maxPalindrome;
	}
	
	static boolean isPalindrome(String s) {
		return new StringBuilder(s).reverse().toString().equalsIgnoreCase(s);
	}
Der Parameter n gibt die maximale Anzahl an Stellen der beiden Faktoren an.

Wieso meinst du, String.valueOf sei unnötig aufwändig? Über einen StringBuilder lässt sich meiner Meinung nach am elegantesten prüfen, ob eine Zahl ein Palindrom ist. Ich lasse mich aber gerne eines Besseren belehren. 😉
 

Neue Themen


Zurück
Oben