programm
-
Hallo ich habe ein easy c-programm.
ich soll zwei positive zahlen miteinander multiplizieren, wobei nur Addition und subtraktion als rechenoperationen benutzt werden dürfen. Die objekte seien die variablen x, y, z und die konstanten 0 und 1.
Ich könnte es programmieren, aber leider hat es einige einschränkungen wie:
nur Operationen---> +,-,=,!=
Wie kann ich da vorgehen???
ich bräuchte noch den operator < oder gehts auch ohne?
-
//x==positive ganze zahl while ( x != 0 ) { Ergebnis+=y; --x; }
-
sowas hir?
x,y sin die eingegebenen zahlen.
int sum=0; for (int z=0;z==y;x++) { sum+=x; }
MFG TaccoGo
-
Für die Multiplikation gilt folgendes mathematische Gesetz
x * y = y + ((x-1)+y)unsigned int rekursiv_mul(unsigned int x, unsigned int y) { if(x>0) return y + rekursiv_mul(x-1, y); else return 0; }
-
Vertexwahn schrieb:
Für die Multiplikation gilt folgendes mathematische Gesetz
x * y = y + ((x-1)+y)stimmt gar nicht.
setzt mal ein, da kommt nicht das gleiche raus
-
Für die Multiplikation gilt folgendes mathematische Gesetz
und das hat welchen namen?
-
er meint vermutlich
a*b = a+ (b-1) [b]*[/b] a , b > 0 0 , b = 0
gilt natürlich nicht in besonders vielen Situationen, als Gesetz kenn ich das auch nicht ;).
-
a * b = a + a * b - a = a + a * ( b - 1 ) ziemlich trivial; wieso muss eigentlich alles, was rekursiv möglich ist, auch rekursiv gemacht werden ? :p
// z = x * y, x >= 0 for(int z=0;x--;z+=y);
-
wahrscheinlich, weil der compiler sowas dann intern wieder besser zu einem mul zusammenschieben kann
-
noch ne kleine anmerkung...
so ist multiplizieren arschlangsam...
besser ist es um die zahl um die im Faktor enthaltenen zweierpotzen zu shiften und den krempel auf zu addieren...
-
Windalf schrieb:
noch ne kleine anmerkung...
so ist multiplizieren arschlangsam...
besser ist es um die zahl um die im Faktor enthaltenen zweierpotzen zu shiften und den krempel auf zu addieren...das ist schon klar, siehe aber oben bzgl. einschränkunken verwendbarer operatoren...
-
@camper
also 1) Ich hab nur anmerkung geschrieben
2) haben einge von euch auch gegen die verstossen (ich hab nicht gesehen das ++i oder --i erlaubt ist...)
3)jetzt köntnest du zwar sagen ++i kann man auch durch i=i+1 abbilden...
ein shiften bzw. mit zwei multiplizieren kann man leicht abbilden indem man a=a+a verwendet... sind dann am ende immer noch weniger operation weil man z.b. für eine multiplikation mit 8 nur 3 mal a=a+a; schreiben mussPS: hatte ganz vergessen den Klugscheissmode anzuschalten...
-
hehe
[klugscheiss] - den linksshift operator kannst du noch durch addition ersetzen, bei rechtsshift wirds aber schwierig - (mit div wollen wir ja wohl kaum anfangen), während ++ bzw. -- direkt in addition bzw. subtraktion übergeht (zumindest im prefix).
die anmerkung ist aber insofern irrelevant, weil multiplikation nun mal am schnellsten geht, wenn man direkt multipliziert lol [/klugscheiss]
wie würde das denn aussehen... etwa so:
z=0; if ( x ) do { if ( x & 1 ) z += y; y <<= 1; } while ( x >>= 1 );
muss allerdings vorzeichenlos sein. und & brauch man auch noch - oder hat jemand einen besseren vorschlag ?
edit: nur mit linksshift gehts auch:
unsigned z = 0; unsigned temp = 1; if ( x ) do { if ( x & temp ) z = z + y; y = y + y; } while ( temp = temp + temp );
bleibt halt nur das hässliche &
-
ok - ich hab gelogen - ist gar kein mathematisches gesetzt und es gilt nur für Natürliche Zahlen