Seite 1 von 1

ägyptische Multiplikation

Verfasst: Dienstag 5. Juni 2007, 08:39
von singstar

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

Verfasst: Dienstag 5. Juni 2007, 10:14
von BlackJack
Ausser das hier jemand Deine Hausaufgaben lösen soll, habe ich die Frage nicht ganz verstanden. ;-)

Was sind denn die einzelnen "Teile"?

Verfasst: Dienstag 5. Juni 2007, 11:38
von Sr4l
Unter Wikipedia steht sogar das Codebespie in Python :-D

such mal nach http://de.wikipedia.org/wiki/Russische_ ... iplikation

Verfasst: Dienstag 12. Juni 2007, 07:54
von singstar
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]

Verfasst: Dienstag 12. Juni 2007, 08:36
von Zap
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

Verfasst: Dienstag 12. Juni 2007, 08:50
von 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.

Verfasst: Dienstag 12. Juni 2007, 09:53
von Michael Schneider
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

Verfasst: Dienstag 12. Juni 2007, 11:39
von 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]: ''

Verfasst: Mittwoch 13. Juni 2007, 06:29
von Michael Schneider
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