Python :: Aufgabe #145

4 Lösungen Lösungen öffentlich

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?

Lösungen:

2 Kommentare
vote_ok
von jigga (2880 Punkte) - 25.02.2017 um 10:39 Uhr
Quellcode ausblenden 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
1 Kommentar
vote_ok
von ZRX88 (2010 Punkte) - 05.03.2017 um 13:21 Uhr
Quellcode ausblenden 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)
vote_ok
von Nachbar (2420 Punkte) - 20.03.2017 um 18:07 Uhr
Quellcode ausblenden 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]
vote_ok
von jigga (2880 Punkte) - 23.03.2017 um 13:06 Uhr
Quellcode ausblenden 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