Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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",""));
}
}
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",""));
}
}
@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",""));
}
}
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?
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?
@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.