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

ägyptische Multiplikation

Beitragvon singstar » Dienstag 5. Juni 2007, 08:39

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

Beitragvon BlackJack » Dienstag 5. Juni 2007, 10:14

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:

Beitragvon Sr4l » Dienstag 5. Juni 2007, 11:38

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

Beitragvon singstar » Dienstag 12. Juni 2007, 07:54

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

Beitragvon Zap » Dienstag 12. Juni 2007, 08:36

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

Beitragvon BlackJack » Dienstag 12. Juni 2007, 08:50

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: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Dienstag 12. Juni 2007, 09:53

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

Beitragvon BlackJack » Dienstag 12. Juni 2007, 11:39

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: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Mittwoch 13. Juni 2007, 06:29

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]