Python :: Aufgabe #145
5 Lösungen
Existiert die Kaprekar-Konstante?
Anfänger - Python
von hollst
- 23.02.2017 um 13:29 Uhr
Man weise numerisch nach, ob die Behauptung des indischen Mathematikers Kaprekar richtig ist.
Kaprekar hat folgendes behauptet (1949):
1.) Man nehme eine vierstellige Dezimalzahl D, wobei nicht alle vier Stellen identisch sein dürfen
(also 1111, 2222 etc. sind nicht erlaubt, aber z. B. 0001 ist erlaubt).
2.) D überführe man in zwei Zahle D1 und D2, indem bei D1 die Digits in absteigender und bei D2 in aufsteigender Reihenfolge
angeordnet werden (also z. B. D = 1724 -> D1 = 7421 und D2 = 1247; oder D = 1 -> D1 = 1000 und D2 = 1).
3.) Man subtrahiere nun D2 von D1; mit dem Ergebnis (Dneu = D1 - D2) wiederhole man Pkt. 2 durch Ersetzen von D durch Dneu solange,
bis sich nichts mehr ändert.
Die unglaubliche Behauptung ist, dass bei diesem Algorithmus stets das gleiche Ergebnis herauskommt (die sogenannte Kaprekar-Konstante),
egal, mit welchem D man beginnt.
Frage: Wie lautet die Kaprekar-Konstante?
Kaprekar hat folgendes behauptet (1949):
1.) Man nehme eine vierstellige Dezimalzahl D, wobei nicht alle vier Stellen identisch sein dürfen
(also 1111, 2222 etc. sind nicht erlaubt, aber z. B. 0001 ist erlaubt).
2.) D überführe man in zwei Zahle D1 und D2, indem bei D1 die Digits in absteigender und bei D2 in aufsteigender Reihenfolge
angeordnet werden (also z. B. D = 1724 -> D1 = 7421 und D2 = 1247; oder D = 1 -> D1 = 1000 und D2 = 1).
3.) Man subtrahiere nun D2 von D1; mit dem Ergebnis (Dneu = D1 - D2) wiederhole man Pkt. 2 durch Ersetzen von D durch Dneu solange,
bis sich nichts mehr ändert.
Die unglaubliche Behauptung ist, dass bei diesem Algorithmus stets das gleiche Ergebnis herauskommt (die sogenannte Kaprekar-Konstante),
egal, mit welchem D man beginnt.
Frage: Wie lautet die Kaprekar-Konstante?
Lösungen:
Python-Code
def kaprekar(d): d1 = d2 = 0 while True: liste = [] for i in range(len(str(d))): liste.append(d[i]) d1 = int(''.join(sorted(liste,reverse=True))) d2 = int(''.join(sorted(liste))) if (str(d1-d2) != (d)): d = str(d1-d2) else: print("Kaprekar-Konstante: ",d) break while True: d = input("Vierstellige Zahl eingeben: ") if len(d) != 4: print("Nur vierstellige Zahlen!\n") continue if d == "1111" or d == "2222" or d == "3333" or d == "4444" or d == "5555"\ or d == "6666" or d == "7777" or d == "8888" or d == "9999": print("Keine Schnapszahlen!\n") continue else: kaprekar(d) break
Python-Code
import math def array_to_number(array): zahl = 0 for i in range(4): if array[3-i] != 0: zahl += int(array[3-i])*int(math.pow(10,i)) return zahl def steps(zahl): aufsteigend = sorted(zahl) absteigend = sorted(zahl ,reverse=True) return int(array_to_number(absteigend) - array_to_number(aufsteigend)) # testing number zahl = 2351 for x in range(100): zahl = steps(str(zahl)) print(zahl)
Python-Code
# Python 2.7 # -*- coding: utf-8 -*- eingabe = raw_input("4-stellige Zahl: ") kaprekar = [0] if eingabe[0] == eingabe[1] == eingabe[2] == eingabe[3]: exit() elif len(eingabe) > 4 or len(eingabe) < 4: exit() # Sortierung auf- und absteigend def sort_absteigend(zahl, neue_zahl): while len(neue_zahl) < 4: maxzahl = max(zahl) neue_zahl = neue_zahl + maxzahl zahl = zahl.replace(maxzahl,"0", 1) return neue_zahl def sort_aufsteigend(zahl, neue_zahl): while len(neue_zahl) < 4: minzahl = min(zahl) neue_zahl = neue_zahl + minzahl zahl = zahl.replace(minzahl,"9", 1) return neue_zahl # Berechnung der Konstante while True: x = int(sort_absteigend(eingabe, "")) - int(sort_aufsteigend(eingabe, "")) eingabe = str(x) if x not in kaprekar: del kaprekar[0] kaprekar.append(x) else: True = False print "\nKaprekar-Konstante: ", kaprekar[0]
Python-Code
def kaprekar(d): d1 = d2 = 0 while True: liste = [] for i in range(len(str(d))): liste.append(d[i]) if len(liste) == 3: liste.append('0') d1 = int(''.join(sorted(liste,reverse=True))) d2 = int(''.join(sorted(liste))) if (str(d1-d2) != (d)): d = str(d1-d2) else: print("Kaprekar-Konstante: ",d) break while True: d = input("Vierstellige Zahl eingeben: ") if len(d) != 4: print("Nur vierstellige Zahlen!\n") continue if d == "1111" or d == "2222" or d == "3333" or d == "4444" or d == "5555"\ or d == "6666" or d == "7777" or d == "8888" or d == "9999": print("Keine Schnapszahlen!\n") continue else: kaprekar(d) break
Python-Code
#Kaprekar #Eingabe und Überprüfung zahl_eingabe = int(input("Gib bitte eine 4-stellige Zahl ein. Die Ziffern dürfen nicht gleich sein:" )) while 0 > zahl_eingabe or zahl_eingabe%1111 == 0 or zahl_eingabe >=10000: zahl_eingabe = int(input("Die Zahl entsprach nicht den Vorgaben, bitte wiederholen")) #Ausführung def kaprekar(zahl): zahl = str(zahl).zfill(4) #print(zahl) ziffern = [] for zif in zahl: ziffern.append(zif) ziffern.sort() zahl1 = "" zahl2 = "" for i in range(0,4): zahl2 = ziffern[i] + zahl2 zahl1 = zahl1 + ziffern[i] neue_zahl = (int(zahl2)-int(zahl1)) return(neue_zahl) zahl = kaprekar(zahl_eingabe) print(zahl) # Schleife bis zur Konstanten while True: if zahl == kaprekar(zahl): break print(kaprekar(zahl)) zahl = kaprekar(zahl)