Hallo ich arbeite erst seit kurzen mit Python und hab ne kleine Frage.
Wie kann man in Python alternierende und nichtalternierende Quersummenregeln programmieren, sodass das Programm die Berechnung mit dem Zwischenschritt wieder ausgibt?
Hab es so gemacht, dass man zwei Zahlen eingibt. Für die eine berechnet dann mein Programm die Teilbarkeitsregel bei der anderen soll sie angewendet werden.
Bin inzwischen soweit dass ich die Anzahl der "Blöcke" die sich dann bilden berechnen kann...
Habe diese Variable m und die der Zahl wo die k-alternierende oder nichtalternierende Teilbarkeitsregel angewendet werden soll l gennant.
Danke schon mal im voraus
Alternierende und Nichtalternierende Regel
Ich versteh nur Bahnhof. Wenn das das aus dem Wiki-Artikel ist, wieso nicht abwechselnd die Ziffern addieren und den Multiplikator alternieren lassen. Da reichts schon einfach stetig mit -1 zu multiplizieren. Da das ohnehin eine Schleife ist, sollte die Ausgabe der Zwischenschritte trivial sein.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Du hast die "Zahl" also eh zuerst als String. Diesen kann man prima zerlegen oder über die einzelnen Zeichen (= Ziffern in Deinem falle) iterieren:
Code: Alles auswählen
sum(int(digit) for digit in "12345")
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Sorry irgendwie blick ich es nicht. Mein Programm sieht inzwischen so aus. Ich glaub ich hab des was Hyperion gesagt hat falsch angewendet oder?
Mein Programm gibt nämlich für b irgendwie nichts aus.
Mein Programm gibt nämlich für b irgendwie nichts aus.
Code: Alles auswählen
import math
print("Bitte geben sie eine Zahl ein, dessen Teilbarkeit Sie wissen wollen ")
n = int(input())
print("Bitte geben Sie eine weitere Zahl ein, die sie auf Teilbarkeit überprüfen wollen")
l = int(input())
#Berechnung der Teilbarkeitsregel noch ohne zusammengesetze Regeln
k = 1
while 10**k % n != 0 and 10**k % n != 1 and 10**k % n != n - 1 :
k = k+1
if 10**k % n == 0:
print(n,"hat eine",k,"Endstellenregel")
elif 10**k % n == 1:
print(n,"hat eine",k,"nichtalternierende Regel")
else :
print(n,"hat eine",k,"alternierende Regel")
#Erste Anwendung der Teilbarkeitsregel
if 10**k % n == 0:
l = l % 10**(k)
print("Nach Anwendung der Teilbarkeitsregel ergibt sich die Zahl",l)
elif 10**k % n == 1:
w = math.log10(l)+1
w = int(w)#Ziffernanzahl der Zahl l
print(w)
m = math.ceil(w/k)
m = int(m)#Anzahl der Blöcke
print("Anzahl Blöcke",m)
print("Nach Anwendung der Teilbarkeitsregel ergibt sich die Zahl")
b = sum(int(1) for l in "12345")
print(b)
@Frager: Für meinen Geschmack wird da ja ein paar mal zu oft ``10**k % n`` ausgerechnet. Und ich würde jetzt schon anfangen das Ganze sinnvoll auf einzelne Funktionen zu verteilen. Zum Beispiel eine zu Abfrage der Daten vom Benutzer. Dann eine die `k` und den Fall bestimmt. Und jeweils eine für jeden der drei Fälle. Also mindestens diese Funktionen, bei Bedarf aber natürlich gerne auch mehr.
Was ich gerne mal exerziere, ist "Function Golfing" (eigene Wortschöpfung)
Ziel ist es, Funktionen zu schreiben, welche lediglich aus einer return-Anweisung bestehen.
Es dient nicht immer der Übersicht, man muss sich jedoch ordentlich in das (Teil-)Problem reindenken.
Ziel ist es, Funktionen zu schreiben, welche lediglich aus einer return-Anweisung bestehen.
Es dient nicht immer der Übersicht, man muss sich jedoch ordentlich in das (Teil-)Problem reindenken.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
`k_quersumme()` währe sicher auch noch ein Kandidat für eine Funktion. Wenn die dann grundsätzlich steht, kann man noch ein `alternating`-Flag nachrüsten mit dem man entscheiden kann ob man die alternierende oder nichtalternierende k-Quersumme berechnen möchte. Denn die beiden unterscheiden sich ja kaum.