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]
 
G

Gelöschtes Mitglied 65838

Gast
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
 

sserio

Bekanntes Mitglied
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).
 

sserio

Bekanntes Mitglied
[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
 
G

Gelöschtes Mitglied 65838

Gast
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
 

sserio

Bekanntes Mitglied
G

Gelöschtes Mitglied 65838

Gast
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
 

sserio

Bekanntes Mitglied
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.
 
G

Gelöschtes Mitglied 65838

Gast
ich kann dir keinen tipp geben weil ich die aufgabe nicht versteh so wie du sie geschrieben hattest
 
G

Gelöschtes Mitglied 65838

Gast
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
 

sserio

Bekanntes Mitglied
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 !
 

mihe7

Top Contributor
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:

sserio

Bekanntes Mitglied
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
 
G

Gelöschtes Mitglied 65838

Gast
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
 

hulda-90

Aktives Mitglied
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());
    }
 
G

Gelöschtes Mitglied 65838

Gast
oder die anderen 50 lösungen die man so im internet findet... hat er was davon ..nein wahrscheinlich nicht
 

sserio

Bekanntes Mitglied
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
 

hulda-90

Aktives Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Größtes Palindrom Produkt aus zwei dreistelligen Zahlen Java Basics - Anfänger-Themen 60
L Rekursion größtes Zeichen Java Basics - Anfänger-Themen 8
K Comparable - Objekte aus Array vergleichen und größtes auswählen Java Basics - Anfänger-Themen 1
W Größtes Element im unsortierten Binärbaum Java Basics - Anfänger-Themen 7
F Größtes Produkt in einem String Java Basics - Anfänger-Themen 4
A Palindrom Java Basics - Anfänger-Themen 3
H Palindrom ermitteln Java Basics - Anfänger-Themen 21
N palindrom erkennen Java Basics - Anfänger-Themen 3
H Harshad-Zahl (Nivenzahl) und Palindrom überprüfen Java Basics - Anfänger-Themen 2
L Palindrom in zweidimensionalem Array Java Basics - Anfänger-Themen 16
B Palindrom Test mit Junit Java Basics - Anfänger-Themen 23
T Auf Palindrom überprüfen Java Basics - Anfänger-Themen 10
R Best Practice Palindrom in einem Text finden Java Basics - Anfänger-Themen 18
L In Javakara Palindrom erkennen. Java Basics - Anfänger-Themen 9
P Programm Hilfe Palindrom Java Basics - Anfänger-Themen 6
C Bei der LinkedList auf Palindrom überprüfen Java Basics - Anfänger-Themen 4
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
C Palindrom im array Java Basics - Anfänger-Themen 5
R Palindrom eines int-Arrays berechnen Java Basics - Anfänger-Themen 14
D Palindrom Java Basics - Anfänger-Themen 15
H Palindrom Programm Java Basics - Anfänger-Themen 8
K Palindrom Test Java Basics - Anfänger-Themen 9
C Überprüfen auf Palindrom Java Basics - Anfänger-Themen 12
P Palindrom Java Basics - Anfänger-Themen 10
R In einem Palindrom 2 Buchstaben vergleichen Java Basics - Anfänger-Themen 16
H Palindrom Java Basics - Anfänger-Themen 7
NoXiD Auf Palindrom Prüfen Java Basics - Anfänger-Themen 9
M Palindrom mit Groß & kleinbuchstaben Java Basics - Anfänger-Themen 19
M Palindrom Test mit Char-arrays! Java Basics - Anfänger-Themen 3
B Produkt eines double - streams Java Basics - Anfänger-Themen 3
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
F Produkt d. Ziffern einer Zahl..?! Java Basics - Anfänger-Themen 5
T Produkt eines mehrdimensionalen Arrays Java Basics - Anfänger-Themen 5
Ocram Methoden Produkt eines Intervalls Java Basics - Anfänger-Themen 11
H pi näherungsweise berechnen - Wallis Produkt Java Basics - Anfänger-Themen 9
R Produkt berechnen Java Basics - Anfänger-Themen 23
E Algorithmus für kart. Produkt: als int [] Feld repräsentiert Java Basics - Anfänger-Themen 10
T Produkt 1-10 mit Zwischenschritten Java Basics - Anfänger-Themen 7
N Matrix Matrix Produkt Java Basics - Anfänger-Themen 7
D The constructor Bestellung(Bestellung.Produkt, Bestellung.Kunde) is undefined Java Basics - Anfänger-Themen 15
B Produkt ohne Multiplizieren? Java Basics - Anfänger-Themen 7
N Produkt Java Basics - Anfänger-Themen 2
U Summe produkt von einem array Java Basics - Anfänger-Themen 9
T Geht so was? public void verkaufe (<X implements Produkt& Java Basics - Anfänger-Themen 8
S mehrere Erweiterungen fürs Produkt Java Basics - Anfänger-Themen 6
J tast-Eingabe_(Vektor)Skalar-produkt Java Basics - Anfänger-Themen 19

Ähnliche Java Themen


Oben