Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Division ohne Division

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 ]
000
11.01.2004, 17:17 Uhr
(un)wissender
Niveauwart


Ein, glaube ich, leichtes Rätsel.
Schreibe ein kleines Programm, dass eine ganze Zahl durch eine andere teilt(mit und ohne Vorzeichen) und das Ergebnis ausgibt, evtl. mit Rest.
Es darf nur geshifted, addiert und subtrahiert werden.
Bsp.: 43 : 8 = 5 Rest 3
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 11.01.2004 um 17:20 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.01.2004, 17:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


was ist par und wie sollen die beiden parameter übergeben werden?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.01.2004, 17:49 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich kann gerade nicht mein compiler anschmeissen....
ohne das zu testen so müsste das z.b. gehen...
ist zwar bestimmt nicht das was du dir vorgestellt hast aber ich addiere nur und nimm noch ein paar funktionen aus der math.h

C++:
void d(int a,int b){printf("%d",(int)(.0000000001+exp(log(a)+log(pow(b,-1)))));


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.01.2004, 17:56 Uhr
Pablo
Supertux
(Operator)


So, meine Version funktioniert nur mit natürlichen Zahlen, überprüfe ich nicht, ob der Teiler 0 ist.


C++:
#include <stdio.h>
int main(int argc, char** argv)
{
    div(atoi(argv[1]), atoi(argv[2]));
    printf("\n");
}


sollte nicht zu par zählen:

Die Funktion:

C++:
void div(int z, int n) {int i=0;printf("%d:%d=",z,n);while((z-=n)>=0)i++;printf("%d mit Rest %d",i,z?z+n:0);}



Ergebnis

Code:
rex@supertux:~/golf> ./golf 8 2
8:2=4 mit Rest 0
rex@supertux:~/golf> ./golf 43 8
43:8=5 mit Rest 3


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 11.01.2004 um 19:01 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.01.2004, 18:48 Uhr
(un)wissender
Niveauwart


Hm, ist alles nicht ganz das, was ich mir vorgestellt habe, aber das hätte ich wohl dazu sagen müssen.

@Windalf
math.h zu verwenden grenzt schon an Kriminaltät.

@Pablo
Richtiges Ergebnis, aber extrem schlecht im Laufzeitverthalten für große Dividenten und kleine Divisoren.


C++:
#include <iostream>
#include <cstdlib>

int main(int argc, char *args[])
{
    if(argc < 3) {
        std::cout << "Bitte etwas eingeben! " << std::endl;
        return 1;
    }
        
    unsigned int divident = atoi(args[1]);
    unsigned int divisor = atoi(args[2]);
    
    if(divisor == 0) {
        std::cout << "haha" << std::endl;
        return 1;
    }
    
    unsigned int temp = divisor;
    unsigned int number = 0;
    
    while(!(temp & 1)) {
        ++number;
        temp >>= 1;
    }
    
    temp = 0;
    for(unsigned int i = 0; i < number; ++i) {      
        temp <<= 1;
        ++temp;      
    }
                  
    std::cout << divident << " / " << divisor << " = "
              << (divident >> number)  << " Rest: "
              << (divident & temp)<<std::endl;
    return 0;
}



Die beiden Schleifen werden jeweils höchsten 32 mal durchlaufen (bei 32bit Systemen.)
Bei 45 / 8 nur jeweils 3 mal.

So, wenn ihr wollt, dann noch für ints (nicht schwer, ihr seid sowieso zu gut dafür).
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 11.01.2004 um 18:51 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.01.2004, 18:54 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@(un)wissender
Ich find meins schöner...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.01.2004, 18:59 Uhr
Pablo
Supertux
(Operator)


@wissender: Das kann gut sein, aber die laut den Regeln muss ein C99 lauffähiges Programm sein, und das ist meins auch. Außerdem ist die Laufzeit meines Algorithmus nicht schlecht, sie liegt genau in O(n) und deine im Prinzip auch, weil number auch von der eingebenen Zahlen abhängen. Ich habe das in weniger als eine Sekunde ausgeführt:

Code:
rex@supertux:~/·T···> ./golf 79854499 1
79854499:1=79854499 mit Rest 0


und 79854499 ist nicht gerade eine kleine Zahl.

Und ich habe ein lauffähiges Programm gepostet, das das richte liefert und mit so wenig Zeichen wie möglich. In den Regeln steht auch nicht, dass es auch die beste Laufzeit haben soll. Naja, ist ja egal, das ist sowieso nur ein Spiel, ich werde mich nicht deshlab ärgern.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 11.01.2004 um 19:00 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.01.2004, 19:23 Uhr
(un)wissender
Niveauwart


Äh, Pablo, soll ich dazu was sagen?
79854499 ,1 macht bei dir 79854499 Subtraktionen, bei mir 2 Schleifen- durchläufe.
Deines liegt in O(n) aber das ist mies, hier zumindest.
Meines liegt nicht in O(n)!
Sondern in O((max 32) * 2), keine Ahnung wie man diese Klasse nennt.
Ich würde sagen, das meines bei diesen Zahlen 98485323092398039835 mal schneller ist.


Ich habe auch nie behauptet, das du die Regeln verletzt hast, im Gegenteil.
Das mit der Performance war nur eine Anmerkung, ich hätte mich halt bei den Reglen besser ausdrücken sollen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.01.2004, 19:30 Uhr
Pablo
Supertux
(Operator)


max 32 = 32. O(konstante Zahl) heißt nur, konstante Laufzeit oder man sagt auch, der Algorithmus habe konstante Kosten.

Wenn es dir nicht gefällt, dass meiner in O(n) läuft, kann ich nichts dafür. O(n) ist nie schlecht Laufzeit, man freut sich immer, wenn man man O(n) kriegt, danach versucht man O(log(n)) zu erreichen. Abe wie gesagt, ich werde mich nicht ärgern deshalb, was soll ich denn dazu sagen, du hast gewonnen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.01.2004, 19:33 Uhr
(un)wissender
Niveauwart



Zitat:
Pablo postete
[...]
Wenn es dir nicht gefällt, dass meiner in O(n) läuft, kann ich nichts dafür. O(n) ist nie schlecht Laufzeit, man freut sich immer, wenn man man O(n) kriegt, danach versucht man O(log(n)) zu erreichen. Abe wie gesagt, ich werde mich nicht ärgern deshalb, was soll ich denn dazu sagen, du hast gewonnen.


Tut mit leid, @Pablo, das ist Blödsinn, man versucht immer, möglichst schnell zu sein und das ist nicht immer O(n). Die Addition von 2 Zahlen sollte z.B. nicht in O(n) liegen, das wäre außergewöhnlich schlecht, in diesem Fall ist O(n) ein sehr schlechte Laufzeit!
Es ging hier auch nicht ums gewinnen, deine Lösung war ja richtig, sonder um ein bisschen Übung und Spaß.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 11.01.2004 um 19:36 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: