Alternierende und Nichtalternierende Regel

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Frager
User
Beiträge: 5
Registriert: Donnerstag 29. Januar 2015, 15:19

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
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

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.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Frager
User
Beiträge: 5
Registriert: Donnerstag 29. Januar 2015, 15:19

Die Zahl wird vom Benutzer eingegeben, wie kann man da am besten einzelnen Ziffern auswählen?
Benutzeravatar
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
Frager
User
Beiträge: 5
Registriert: Donnerstag 29. Januar 2015, 15:19

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.

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)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Frager: was erwartest Du für ein Ergebnis, wenn Du 5 mal 1 zusammen addierst?
BlackJack

@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.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

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.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
BlackJack

`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.
Antworten