Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Multiplizieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ] [ 5 ]
000
02.04.2004, 01:33 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


so hab mir gedacht ich mach mal wieder ein rätsel und da ist mir folgendes eingefallen

zu implementieren ist folgende funktion

C++:
int mymult(int n,int f);


n ist die zu multiplizierende zahl und f der faktor...
zurückgegeben werden soll (welch eine Überraschung) das Produkt...

soweit ja noch supereasy aber es soll noch folgedes gelten
es ist nicht erlaubt multiplikation/division (und auch alle anderen math.h funktionen sind tabu) zu verwenden und es darf keine schleife mehr als mehr als 1+log2(f) durchlaufen werden...
(um ein beispeil zu machen wenn ich mit 17 multipliziere darf ich eine eventuelle schleife nicht mehr als 1+log2(17)=5 und ein paar zerquetschte mal durchlaufen), also einfach 16 mal die zahl aufaddieren is nich.

wie immer gewinnt die kürzeste Lösung... Ich sag mal grosszügig par 120 damit ich nicht geübte golfer mit spielen können... Ich bin mit meinem ersten versuch locker unter 100...

für die faulen unter euch spendier ich heute grosszügiger weise gleich mal ne testcode wo ihr nur noch einfügen müsst


C++:
#include <stdio.h>

int mymult(int n,int f){...}

int main(){
printf("%d\n",mymult(13,11)); //hab mir sagen lassen hier soll wohl 143 rauskommen...:wink:
}


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 02.04.2004 um 01:40 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.04.2004, 12:42 Uhr
Jarling



ich hätte ne Variante, ich weiß nicht, ob das gültig ist... die funktion "mult" ruft sich immer selbst auf und verringert den zweiten Faktor, bis er null ist... funktioniert jedoch noch nicht, wenn dieser negativ ist, das Ergebnis wird dann trotzdem positiv.


C++:
#include <conio.h>
#include <iostream.h>

int mult(int n, int f)
{
  int erg;
  if (f!=0) { if (f<0) {f++;} else {f--;};
      n += mult(n, f);}
      else {return (0);};

  return n;
}

void main()
{
  cout << mult(13,11);   // <-- zeigt tatsächlich 143 an
  getch();
}


Dieser Post wurde am 02.04.2004 um 12:44 Uhr von Jarling editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.04.2004, 12:52 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


alle achtung ist ne nette idee das rekursiv aufzurufen, auf die bin ich gestern nacht gar nicht gekommen...
aber gegolft hast du es ja noch nicht gerade
musst mal versuchen weniger zeichen draus zu machen bei dir kann man ja noch jede menge sparen...
ich halt meine meine lösung noch ein wenig zurück damit auch noch andere mitspielen können
hab meine gar nicht gross geteste die funzt aber glaub ich auch mit negativen zahlen...

wobei dein rekursiver aufruf ja quasi fast geschummelt ist weil du ja auch nur n-1 mal draufaddierst, meine idee war ne andere aber du hast meine regeln einfach schlau umgangen...

naja dann gilt absofort für alle neuen Lösungen.. auch bei rekursiven aufrufen sind nicht mehr als 1+log2(f) durchläufe erlaubt


Bearbeitung:

hab mal meine zeichen gezählt... bin bei 53 zeichen innerhalb der geschweiften klammern


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 02.04.2004 um 13:01 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.04.2004, 13:01 Uhr
Jarling



Jo, aber wo meinst du, sollte ich noch Zeichen einsparen -> ich seh den Zweck der golfens noch nicht ... es werden ja für den Compiler nicht weniger Befehle, und unübersichtlich wirds außerdem.

jetzt klappts auch mit negativem Faktor

C++:
#include <conio.h>
#include <iostream.h>

int mult(int n, int f)
{ int erg;
  if (f<0){n=(-n);f=(-f);};
  if (f!=0) {if(f<0){f++;}else{f--;};
      n+=mult(n,f);}
      else {return 0;};
  return n;}

void main()
{ cout << mult(12,-12);
  getch();}



bin gespannt auf deine Variante, Windalf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.04.2004, 13:02 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


verschachtelte schleifen die wenige durchläufe machen sind ja wahrscheinlich auch nicht erlaubt
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.04.2004, 13:04 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

ich seh den Zweck der golfens noch nicht


es geht nicht darum ein performantes programm zu schreiben, sondern eines was gerade so die mindestanforderung erfüllt und möglichst wenig zeichen verbraucht...(hat 0xdeadbeef mal hier eingeführt und hat das Rätseln doch wesentlich spannender gemacht weil immer einer versucht den anderen zu unterbieten... Es kommt nicht so sehr drauf an wer hier am schnellsten postet sondern wer die beste Idee hat das auf möglichst wenig zeichen zu drücken)..

ich werd mal mit meiner Lösung noch warten... Ich vermute mal das eventuell unwissender oder kronos noch mitspielen wollen die golfen ganz gerne und in letzter zeit gabs ja kaum rästel...
vielleicht spielt ja sogar virtual oder beefy mit das gibt der sache dann einen besonderen reiz zu gewinnen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.04.2004, 13:05 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

verschachtelte schleifen die wenige durchläufe machen sind ja wahrscheinlich auch nicht erlaubt


hab ich nicht verboten weil du damit ja nicht wirklich was gewinnst... beim golfen jedenfalls verlierst du (würd ich fast mit sicherheit sagen) wenn du mehr als eine schleife nimmst aber ich lass mich auch gerne vom gegenteil überzeugen...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 02.04.2004 um 13:06 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.04.2004, 13:33 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich geb mal noch ein tipp... wenn ich 5 * 11 rechnen will ist es das gleiche wie wenn ich 5*(8 + 2 + 1) rechne...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.04.2004, 13:40 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Wie wär`s denn damit?

C++:
#include <stdio.h>

int mymul(int a, int b)
{
    int p;
    __asm
  {
    MOV AX,WORD PTR a
    MUL WORD PTR b
    MOV WORD PTR p,AX
    MOV WORD PTR p+2,DX
  }
    return p;
}
int main()
{
    printf ("%i\n",mymul(590,6000));
    return 0;
}


Klappt leider nicht mit negativen Zahlen und ist jetzt auch nicht sooo kurz.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.04.2004, 13:44 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


naja du kannst es zwar mit assembler machen dann doch aber bitte nicht so ne armselige mutliplikation verwenden...
also mutliplikation mit multiplikation zu lösen war ja nicht gerade sinn der aufgabe.. du solltest es ja gerade ohne multiplizieren (bzw. durch den kehrwert teilen machen)
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ] [ 5 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: