ägyptische Multiplikation

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
singstar
User
Beiträge: 9
Registriert: Freitag 22. Dezember 2006, 13:33

Code: Alles auswählen

def multi(x,y):
    prod = 0
    while y > 0:
        if y % 2 == 1: # Zweiter Faktor ist ungerade
            prod = prod + x # Ein "gutes" Haus: Addieren!
            y = y - 1 # Nun ist er wieder gerade!
        else:
            x = x + x # Erster Faktor wird verdoppelt
            y = y / 2 # Zweiter Faktor wird halbiert
    return prod
ich will aber in binär die einzelnen Teile und als Produkt


Danke
BlackJack

Ausser das hier jemand Deine Hausaufgaben lösen soll, habe ich die Frage nicht ganz verstanden. ;-)

Was sind denn die einzelnen "Teile"?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Unter Wikipedia steht sogar das Codebespie in Python :-D

such mal nach http://de.wikipedia.org/wiki/Russische_ ... iplikation
singstar
User
Beiträge: 9
Registriert: Freitag 22. Dezember 2006, 13:33

BlackJack hat geschrieben:Ausser das hier jemand Deine Hausaufgaben lösen soll, habe ich die Frage nicht ganz verstanden. ;-)

Was sind denn die einzelnen "Teile"?
Nich Jeder der hier eine Frage stellt hat diese auch als HAUSAUFGABE AUF!!!!!! :roll: :roll: :roll: :roll: :roll: :roll: :roll: :roll: :roll:

Code: Alles auswählen

def aegypt_multi (basis, exponent):
    sammel = 1
    exponent = dez2bin(exponent)
    for i in exponent:
        if exponent == 1:
            sammel = ((sammel) ** 2) * basis
        else:
            sammel = (sammel ** 2)
    return sammel
Allerdings haben wir ein Problem mit der Methode dez2bin anscheinend xD

Code: Alles auswählen

def dez2bin(a):
    if a / 2 == 0: return ' '
    else:
        dez2bin(a / 2) + str(a % 2)
Sieht wer vielleicht den Fehler? [/code]
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

singstar hat geschrieben:

Code: Alles auswählen

def dez2bin(a):
    if a / 2 == 0: return ' '
    else:
        dez2bin(a / 2) + str(a % 2)
Das ist nicht umbedingt ein Anwendungsfall der einen rekursiven Aufruf braucht. Guck dir mal dieses Beispiel an:
http://www.daniweb.com/code/snippet285.html
BlackJack

Und der Fehler wäre, dass im ``else``-Zweig das ``return`` fehlt.

Der Funktionsname ist übrigens "falsch", weil hier keine Dezimaldarstellung in eine Binärdarstellung umgewandelt wird, sondern eine (ganze) Zahl in Binärdarstellung.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi,

was ich auch mache, mir fehlt immer die erste Stelle. Ist auch plausibel, da 1/2 nunmal 0 ist und an der Rekursionsabbruchbedingung "" statt "1" zurückgegeben wird.

Aber das ist doch eine Standardaufgabe a la
EDIT: ACHTUNG, bitte nicht verwenden, da fehlerhaft für Parameter 0. Korrektur weiter unten im Thread!!

Code: Alles auswählen

>>> def num2bin(i):
...     if not i: return ""
...     iRest, iWert = divmod(i, 2)
...     return "%s%i" % (num2bin(iRest), iWert)
... 
>>> num2bin(5)
'101'
Gruß,
Michael
Zuletzt geändert von Michael Schneider am Mittwoch 13. Juni 2007, 06:43, insgesamt 1-mal geändert.
Diese Nachricht zersört sich in 5 Sekunden selbst ...
BlackJack

Fast, aber nicht ganz:

Code: Alles auswählen

In [9]: def num2bin(i):
   ...:     if not i: return ""
   ...:     iRest, iWert = divmod(i, 2)
   ...:     return "%s%i" % (num2bin(iRest), iWert)
   ...:

In [10]: num2bin(0)
Out[10]: ''
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

BlackJack hat geschrieben:Fast, aber nicht ganz:
Moin Blacky,

hast wieder einmal recht. :-) Wenn nur noch 0 oder 1 übrig sind, muss man natürlich die zurückgeben:

Code: Alles auswählen

def num2bin(i):
    if i <= 1: return i
    iRest, iWert = divmod(i, 2)
    return "%s%i" % (num2bin(iRest), iWert)

for i in range(5):
    print num2bin(i)
Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten