Palindrom von Zahlen | Code funktioniert nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
zynai
User
Beiträge: 3
Registriert: Donnerstag 21. November 2019, 17:41

Hallo,
ich wollte fragen wieso der Code nicht funktioniert.
Ich programmier eigentlich Java und muss für ein Modul Übungsaufgaben erstellen in Python.
Ich will wissen, ob eine Zahl(Ganzzahl, also kein String) ein Palindrom ist.

Ich krieg ganze Zeit nur den else-Zweig ausgegeben.

Wo liegt das Problem?

Der Code:
-----------------------------------------------------------------------------
def checkPalindrom(number):
reverse = 0
numberCopy = number
while numberCopy!=0:
reverse = reverse *10 + numberCopy % 10
numberCopy = numberCopy / 10
return (number == reverse)

zahl = 2332
bool = checkPalindrom(zahl)
if bool:
print("Die Zahl ist ein Palindrom")
else:
print("Die Zahl ist kein Palindrom")
-----------------------------------------------------------------------------

Danke im Voraus.
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zynai: Du möchtest Dir vielleicht mal das Ergebnis der Division anschauen. Das funktioniert in Python anders als in Java. Vielleicht möchtest Du auch gar keine Division als einzelne Operation sondern mal einen Blick auf die `divmod()`-Funktion werfen.

Namen schreibt man in Python klein_mit_unterstrichen. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Also die letzten beiden wie in Java.

`bool` ist der Name des eingebauten Typs für Wahrheitswerte, den sollte man nicht an etwas anderes binden. Ich sehe auch nicht ganz warum das Zwischenergebnis überhaupt an einen Namen binden sollte.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
zynai
User
Beiträge: 3
Registriert: Donnerstag 21. November 2019, 17:41

Hi, hab's jetzt so gemacht.
Hab mir in der while-Schleife die derzeitige Reverse-Zahl ausgeben lassen und da kamen Fließkommazahlen.
Bin also auf die Idee gekommen um zu Casten. Gibt es auch eine andere Möglichkeit (ohne Casting)?

Ohne Datentypen anzugeben in Python ist ja Fluch und Segen...

Danke im voraus.

Code: Alles auswählen

def check_palindrom(number):
    reverse = 0
    number_copy = number
    while number_copy != 0:
        reverse = int(reverse * 10) + int(number_copy % 10)

        number_copy = int(number_copy / 10)
    return (number == reverse)


zahl = 23732

if check_palindrom(zahl):
    print("Die Zahl ist ein Palindrom")
else:
    print("Die Zahl ist kein Palindrom")
]
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

In Python unterscheidet man Fließkommadivision / und Ganzzahldivision //.
Und wie __blackjack__ schon geschrieben hat, schau Dir mal divmod an.
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Warum schwer wenn es auch einfach geht?

Code: Alles auswählen

def check_palindrom(number):
    nstr = str(number)
    return nstr == nstr[::-1]

print(check_palindrom(12321)) # True
print(check_palindrom(1)) # True
print(check_palindrom(555)) # True
print(check_palindrom(12)) # False
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@ThomasL: kommt halt drauf an, was man lernen soll. Deine Loesung ist in Python richtig und gut, und uebt dort mit slicing insbesondere umzugehen. Andere betonen lieber den Umgang mit Zahlen. Du waerst erstaunt, wieviele Leute es gibt, die mit so simplen arithmetischen Uebungen Schwierigkeiten haben.
zynai
User
Beiträge: 3
Registriert: Donnerstag 21. November 2019, 17:41

@ThomasL: ich bin mir bewusst das es einfacher geht. Wollte aber das die Studenten ohne Strings arbeiten (wie oben beschrieben) und nur mit Zahlen. Bisschen zum aufwärmen um rein zukommen in die Programmiersprache. Hab noch vier andere Aufgaben die ich Ihnen stellen werde :)
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

`number_copy` ist in irreführender Name, denn da werden ja gar keine Kopien gemacht.

Code: Alles auswählen

def check_palindrom(number):
    reverse = 0
    original = number
    while number != 0:
        number, rest = divmod(number, 10)
        reverse = 10 * reverse + rest
    return original == reverse
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Code: Alles auswählen

#!/bin/env python3
#coding: utf-8


def is_palindrome(seq):
    return seq == seq[::-1]


def is_palindromic_number(num, base):
    digits = []
    while num:
        num, digit = divmod(num, base)
        digits.append(digit)
    return is_palindrome(digits)


def main(num):
    if is_palindromic_number(num, 10):
        print(f"{num} is a palindromic number!")
        return 0
    else:
        print(f"{num} is a not palindromic number!")
        return 1


if __name__ == '__main__':
    import argparse, sys
    parser = argparse.ArgumentParser(
                description='Test if a given integer is palindromic.')
    parser.add_argument('number', metavar='N', type=int, help='An integer.')
    sys.exit(main(parser.parse_args().number))
Ergebnis:

Code: Alles auswählen

$ python3 palindrome.py 56765
56765 is a palindromic number!
$ python3 palindrome.py 56767
56767 is a not palindromic number!
In specifications, Murphy's Law supersedes Ohm's.
Antworten