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:
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
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 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]
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
#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)