Der Algorithmus:
- Solange die Zahl mindestens aus zwei Ziffern besteht, soll eine neue Zahl gebildet werden,
- wobei die Einer-Zahl entfernt wird
- und von der gekürzten Zahl subtrahiert wird.
- Falls die verbleibende zweistellige Zahl durch 11 teilbar ist, dann ist auch die ursprüngliche Zahl durch 11 teilbar.
def teste_teilbarkeit_11(n):
'''Der Algorithmus prueft, ob eine Zahl
durch 11 teilbar ist. Entwickelt wurde das
Verfahren durch Reverend Charles Dodgson 1897
'''
print(n)
while len(str(n)) >= 2:
if n < 11:
return False
elif len(str(n)) == 2 and str(n)[0] == str(n)[1]:
return True
else:
n = int(str(n)[:-1]) - int(str(n)[-1])
print(n)
n = 161408196180
liste = [11,33,121,143,144,161408196180, 195024706980990699675294451800000]
for item in liste:
if teste_teilbarkeit_11(item) == True:
print("\nThe number {} is divisible by 11.\n".format(item))
else:
print("\nThe number {} is not divisible by 11.\n".format(item))
Es funktioniert. Alternativ eine Umsetzung, die ganz auf Modulo, größer/kleiner als und damit eben nicht auf Umwandlung der Zahl in Strings setzen muss.
def teste_teilbarkeit_11(n):
'''Der Algorithmus prueft, ob eine Zahl
durch 11 teilbar ist. Entwickelt wurde das
Verfahren durch Reverend Charles Dodgson 1897
'''
print(n)
while n >= 11:
if 11 <= n <= 99 and n % 11 == 0:
return True
else:
n = n // 10 - n % 10
print(n)
return False
Auch das geht, was die Konsolenausgabe zeigt:161408196180 16140819618 1614081953 161408192 16140817 1614074 161403 16137 1606 154 11 The number 161408196180 is divisible by 11.Der Algorithmus war mir bislang nicht bekannt.
Keine Kommentare:
Kommentar veröffentlichen