Seite 1 von 1

Alternierende und Nichtalternierende Regel

Verfasst: Donnerstag 29. Januar 2015, 15:33
von Frager
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

Re: Alternierende und Nichtalternierende Regel

Verfasst: Donnerstag 29. Januar 2015, 15:58
von darktrym
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.

Re: Alternierende und Nichtalternierende Regel

Verfasst: Donnerstag 29. Januar 2015, 17:06
von Frager
Die Zahl wird vom Benutzer eingegeben, wie kann man da am besten einzelnen Ziffern auswählen?

Re: Alternierende und Nichtalternierende Regel

Verfasst: Donnerstag 29. Januar 2015, 20:35
von Hyperion
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")

Re: Alternierende und Nichtalternierende Regel

Verfasst: Sonntag 1. Februar 2015, 14:01
von Frager
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)

Re: Alternierende und Nichtalternierende Regel

Verfasst: Sonntag 1. Februar 2015, 14:15
von Sirius3
Frager: was erwartest Du für ein Ergebnis, wenn Du 5 mal 1 zusammen addierst?

Re: Alternierende und Nichtalternierende Regel

Verfasst: Sonntag 1. Februar 2015, 14:44
von 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.

Re: Alternierende und Nichtalternierende Regel

Verfasst: Sonntag 1. Februar 2015, 15:06
von bwbg
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.

Re: Alternierende und Nichtalternierende Regel

Verfasst: Sonntag 1. Februar 2015, 15:52
von 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.