Größtes Palindrom-Produkt Programm funktioniert nur halb

sserio

Bekanntes Mitglied
Die Aufgabe ist es, dass zwei dreistellige zahlen multipliziert werden sollen und herausgefunden werden soll, welches das größte Palindrom Produkt ist. Bei mir wird aus irgend einem Grund 580085 ausgegeben, obwohl es 906609 sein sollte.
[CODE lang="java" title="Palindrome finden von xxx * xxx"]package ProjectEuler4;

public class Main {
public static void main(String[] args) {
System.out.println(findBiggestPalindromeNum());
}

public static int findBiggestPalindromeNum() {
int num = 0;
for (int i = 100; i < 1000 ; i++) {
for (int j = 100; j < 1000; j++) {
if (isPalindromeNum(i, j)) {
num = i * j;
if (num < i * j) {
num = i * j;
}
}
}
}
return num;
}

public static boolean isPalindromeNum(int f, int s) {
String a = String.valueOf(f * s);
int[] ascii = new int[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57};
int[] nums = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] arr = new int[a.length()];
for (int i = 0; i < a.length(); i++) {
for (int j : nums) {
if (a.charAt(i) == ascii[j]) {
arr = nums[j];
}
}
}
if (a.length() == 5 && arr[0] == arr[4] && arr[1] == arr[3]) {
return true;
}
return a.length() == 6 && arr[0] == arr[5] && arr[1] == arr[4] && arr[2] == arr[3];
}
}
[/CODE]
 
ich glaub du kannst den fehler selber finden das schaffst du schon...

ich möchte dir mal ein paar anregungen geben

Java:
                    num = i * j;
                    if (num < i * j) {
                        num = i * j;
                    }

in welcher welt oder dimension kann das IRGENDWANN mal true sein ?

zweitens

i und j und num ist der klassiker... wie mans lernt weil man es falsch lernt... NIMM wörter her ersteZahl... oder firstNumber ist besser als i j und summ
 
ich glaub du kannst den fehler selber finden das schaffst du schon...

ich möchte dir mal ein paar anregungen geben

Java:
                    num = i * j;
                    if (num < i * j) {
                        num = i * j;
                    }

in welcher welt oder dimension kann das IRGENDWANN mal true sein ?

zweitens

i und j und num ist der klassiker... wie mans lernt weil man es falsch lernt... NIMM wörter her ersteZahl... oder firstNumber ist besser als i j und summ
wieso sollte es denn nicht funktionieren wenn i und j mit jedem schleifendurchgang +1 gerrechnet werden. Dann wird gescheckt ob es eine Palindrom Zahl ist oder nicht. Also es liegt nicht daran, dass es nicht true ist. Ich kriege ja ein ergebnis, jedoch das falsche (siehe oben).
 
[CODE lang="java" title="."]package ProjectEuler4;

public class Main {
public static void main(String[] args) {
System.out.println(findBiggestPalindromeNum());
}

public static int findBiggestPalindromeNum() {
int num = 0;
for (int i = 100; i < 1000 ; i++) {
for (int j = 100; j < 1000; j++) {
if (isPalindromeNum(i, j)) {
num = i * j;
}
}
}
return num;
}

public static boolean isPalindromeNum(int f, int s) {
String a = String.valueOf(f * s);
int[] ascii = new int[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57};
int[] nums = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] arr = new int[a.length()];
for (int i = 0; i < a.length(); i++) {
for (int j : nums) {
if (a.charAt(i) == ascii[j]) {
arr = nums[j];
}
}
}
return a.length() == 6 && arr[0] == arr[5] && arr[1] == arr[4] && arr[2] == arr[3];
}
}
[/CODE]
habe es jetzt ohne diese Zeilen geschrieben, kein unterschied
 
natürlich hat das keinen effekt

weil die zeilen nicht ausgeführt werden können

schon mal mal gerechnet ?
du sagst

und dann

gleich in der nächsten zeile
falls ergebnis kleiner i * j ist

wann sollten diese aussagen wahr sein ?

deswegen ja ... bring deinen code in ordnung mit guten bezeichnungen dann findest du den fehler schneller
 
es ist ansich komplett irrelevant ob das ding funtkioniert oder nicht am anfang (am beginnen von programmieren lernen ,und nicht "am anfang" des programm schreibens ) ... es geht darum dass du in deinen kopf es rein kriegst wie was funktioniert beim programmieren

du solltest besser werden und schlechte sachen ablegen wie zb miserable variablen namen

und dass man mal eine komplett sinnloses if schreibt passiert jedem nur das solltest du selber erkennen


zusätzlich versteh ich die aufgabe nicht wirklich


soll ich die zahlen einfach aneinander klippsen? oder umwandeln ? ode reinfach mal nehmen ?
außerdem versteh ich bei dieser aufgabe nur 1e sache und das ist
mindestens 1e methode die 2 zahlen akzeptiert ... und irgendwas palindromiert und nicht in der doppelten for schleife das ist das einzige wo ich mir relativ sicher bin
 
es ist ansich komplett irrelevant ob das ding funtkioniert oder nicht am anfang (am beginnen von programmieren lernen ,und nicht "am anfang" des programm schreibens ) ... es geht darum dass du in deinen kopf es rein kriegst wie was funktioniert beim programmieren

du solltest besser werden und schlechte sachen ablegen wie zb miserable variablen namen

und dass man mal eine komplett sinnloses if schreibt passiert jedem nur das solltest du selber erkennen
okk, mache das Ganze auch nur in der Freizeit wenn ich mal Lust und Zeit neben der Schule habe. Wenn du dennoch weißt wie mein Programm funktionieren könnte, kannst du mir gerne nen Tipp geben.
 
ich kann dir keinen tipp geben weil ich die aufgabe nicht versteh so wie du sie geschrieben hattest
 
Java:
    for(var i =999; i>100; i--){
        for(var j = 999; j>100; j--){
            var mul = j*i;
            if(isPalin(mul)){
                System.out.println("gefunden")
            }
        }
    }
boolean isPalin(int testZahl){
....testen obs palindrom ist
}

Java:
       String str= "Geeks", nstr="";
        char ch;
      
      System.out.print("Original word: ");
      System.out.println("Geeks"); //Example word
      
      for (int i=0; i<str.length(); i++)
      {
        ch= str.charAt(i); //extracts each character
        nstr= ch+nstr; //adds each character in front of the existing string
      }
      System.out.println("Reversed word: "+ nstr);

vlllt ist es logischer den string 1 mal umzudrehen und dann zu schauen ob es .equals ist... als wie das ding was du hast
 
Java:
    for(var i =999; i>100; i--){
        for(var j = 999; j>100; j--){
            var mul = j*i;
            if(isPalin(mul)){
                System.out.println("gefunden")
            }
        }
    }
boolean isPalin(int testZahl){
....testen obs palindrom ist
}

Java:
       String str= "Geeks", nstr="";
        char ch;
     
      System.out.print("Original word: ");
      System.out.println("Geeks"); //Example word
     
      for (int i=0; i<str.length(); i++)
      {
        ch= str.charAt(i); //extracts each character
        nstr= ch+nstr; //adds each character in front of the existing string
      }
      System.out.println("Reversed word: "+ nstr);

vlllt ist es logischer den string 1 mal umzudrehen und dann zu schauen ob es .equals ist... als wie das ding was du hast
ich habe mir das ganze jetzt mal ausgeben lassen, wieso zur hölle wird am anfang direkt eine 500.000 tausender zahl ausgegeben
580085
514415
906609
119911
282282
141141
eigentlich müsste die
906609
die erste sein !
 
ich habe mir das ganze jetzt mal ausgeben lassen, wieso zur hölle wird am anfang direkt eine 500.000 tausender zahl ausgegeben
Weil das i zunächst mal bei 999 steht und das j von 999 bis 100 runtergezählt wird. Dann erst wird das i um eins verringert und das j wieder von 999 bis 100 gezählt. Die Produkte sind also nur in der inneren Schleife monoton fallend.

Vielleicht hilft Dir die Ausgabe:
Code:
jshell> System.out.println("max palindrome: " + maxPalindrome())
new max palindrome 580085 found (995 * 583)
new max palindrome 906609 found (993 * 913)
max palindrome: 906609
 
Zuletzt bearbeitet:
Weil das i zunächst mal bei 999 steht und das j von 999 bis 100 runtergezählt wird. Dann erst wird das i um eins verringert und das j wieder von 999 bis 100 gezählt. Die Produkte sind also nur in der inneren Schleife monoton fallend.

Vielleicht hilft Dir die Ausgabe:
Code:
jshell> System.out.println("max palindrome: " + maxPalindrome())
new max palindrome 580085 found (995 * 583)
new max palindrome 906609 found (993 * 913)
max palindrome: 906609
Ich komm einfach nicht drauf wie ich meinem programm sage, dass es immer die größte zahl nehmnén soll oder halt diese ersten zwei palindrome auslassen soll
 
du speicherst es dir ein... falls das neue größer ist speicherst du das neue ein falls nicht lässt du das alte im speicher

ein einfaches int x an der richtigen stelle
 
ungefähr so sollte es funktionieren:

Java:
    public static int findBiggestPalindromeNum() {
        int num = 0;
        for (int i = 100; i < 1000; i++) {
            for (int j = 100; j < 1000; j++) {
                if (i * j > num && isPalindromeNum(i, j)) {
                    num = i * j;
                }
            }
        }
        return num;
    }

    public static boolean isPalindromeNum(int i, int j) {
        int x = i * j;
        String s = String.valueOf(x);
        for (int k = 0; k < s.length() / 2; k++) {
            if (s.charAt(k) != s.charAt(s.length() - k - 1)) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        System.out.println(findBiggestPalindromeNum());
    }
 
oder die anderen 50 lösungen die man so im internet findet... hat er was davon ..nein wahrscheinlich nicht
 
ungefähr so sollte es funktionieren:

Java:
    public static int findBiggestPalindromeNum() {
        int num = 0;
        for (int i = 100; i < 1000; i++) {
            for (int j = 100; j < 1000; j++) {
                if (i * j > num && isPalindromeNum(i, j)) {
                    num = i * j;
                }
            }
        }
        return num;
    }

    public static boolean isPalindromeNum(int i, int j) {
        int x = i * j;
        String s = String.valueOf(x);
        for (int k = 0; k < s.length() / 2; k++) {
            if (s.charAt(k) != s.charAt(s.length() - k - 1)) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        System.out.println(findBiggestPalindromeNum());
    }
Danke ich Versuchs damit
 
Mit dem einzigen Unterschied, dass er bei meiner Variante nicht in die Prüfung springt wenn ein Palindrom nicht größer als ein bisheriges wäre
 

Zurück
Oben