Teilen Sie eine Zahl durch 3, ohne die Operatoren *, /, +, -, % zu verwenden

Lesezeit: 4 Minuten

Wie würden Sie eine Zahl durch 3 teilen, ohne zu verwenden *, /, +, -, %Betreiber?

Die Nummer kann signiert oder unsigniert sein.

  • Das identifizierte Duplikat ist kein Duplikat. Beachten Sie, dass mehrere Antworten hier weder Bitverschiebung noch Addition verwenden, da diese Frage eine Lösung nicht auf diese Operationen beschränkte.

    – Michael Burr

    28. Juli 2012 um 0:37 Uhr

  • Übrigens: Die andere Frage war ungefähr überprüfen, ob eine Zahl ist durch 3 teilbar. Bei dieser Frage geht es um Teilen um 3.

    – Wildpässer

    30. Juli 2012 um 13:57 Uhr

  • Vielleicht wollte der Interviewer fragen: „Wie teilt man durch 2 ohne blah blah blah zu verwenden”. Das wäre eine vernünftige Frage, die die meisten Entwickler beantworten können sollten.

    – Sam Elstob

    9. August 2012 um 12:09 Uhr


  • x /= 3; verwendet den /-Operator nicht, /= ist ein anderer Operator.

    – James

    21. August 2012 um 15:13 Uhr

  • Diese Frage ist für SO offtopic. Es gehört codegolf.stackexchange.com

    – Kromster

    3. Juni 2014 um 4:28 Uhr

Idiotische Zustände verlangen nach einer idiotischen Lösung:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE * fp=fopen("temp.dat","w+b");
    int number=12346;
    int divisor=3;
    char * buf = calloc(number,1);
    fwrite(buf,number,1,fp);
    rewind(fp);
    int result=fread(buf,divisor,number,fp);
    printf("%d / %d = %d", number, divisor, result);
    free(buf);
    fclose(fp);
    return 0;
}

Wenn auch der Dezimalteil benötigt wird, einfach deklarieren result wie double und füge das Ergebnis von hinzu fmod(number,divisor).

Erklärung, wie es funktioniert

  1. Das fwrite schreibt number Bytes (im obigen Beispiel ist die Zahl 123456).
  2. rewind setzt den Dateizeiger auf den Anfang der Datei zurück.
  3. fread liest maximal number “Aufzeichnungen”, das sind divisor in der Länge aus der Datei und gibt die Anzahl der gelesenen Elemente zurück.

Wenn Sie 30 Bytes schreiben und dann die Datei in Einheiten von 3 zurücklesen, erhalten Sie 10 “Einheiten”. 30 / 3 = 10

  • @earlNameless: Sie wissen nicht, was sie darin verwenden, sie befinden sich in der Blackbox von “Implementierung definiert”. Nichts hält sie davon ab, einfach bitweise Operatoren zu verwenden; Wie auch immer, sie befinden sich außerhalb der Domäne meines Codes, also ist das nicht mein Problem. 🙂

    – Matteo Italien

    29. Juli 2012 um 1:02 Uhr


  • @IvoFlipse von I can clean, du bekommst einen großen etwas und schiebe es in etwas, das dreimal zu klein ist, und dann schau, wie viel hineinpasst. Das ist ungefähr ein Drittel.

    – AncientSwordRage

    29. Juli 2012 um 15:00 Uhr

  • bat den besten C-Programmierer (und sozial unbeholfensten) in unserem Unternehmen, den Code zu erklären. nachdem er es getan hatte, sagte ich, es sei ziemlich genial. Er sagte: „Dieser Dreck ist keine Lösung“ und bat mich, seinen Schreibtisch zu verlassen

    – Lebenslaufursache

    30. Juli 2012 um 12:45 Uhr

  • @cvursache Ich denke, der Punkt ist, dass die Frage so hirntot ist, dass eine hirntote Antwort erlaubt ist. Der “beste C-Programmierer” in Ihrem Unternehmen” hätte genauso gut sagen können, “dass Dreck keine (richtige) Frage ist”.

    – JeremyP

    31. Juli 2012 um 10:18 Uhr

  • @ JeremyP: genau. Mein Punkt ist, dass ich im wirklichen Leben einen Compiler ohne Unterstützung für Arithmetik erhalten hätte Das einzig Vernünftige wäre, nach einem besseren Compiler zu fragen, weil es keinen Sinn macht, unter diesen Bedingungen zu arbeiten. Wenn der Interviewer mein Wissen über die Implementierung der Division mit bitweisen Operationen überprüfen wollte, könnte er einfach direkt sein und es als theoretische Frage stellen; solche “trickübungen” schreien geradezu nach solchen antworten.

    – Matteo Italien

    31. Juli 2012 um 11:22 Uhr


  • Dies könnte tatsächlich funktionieren, wenn es richtig gerundet wird und die Zahl nicht zu groß ist.

    – Mystisch

    27. Juli 2012 um 19:57 Uhr

  • Verbesserte Version: log(pow(exp(number),sin(atan2(1,sqrt(8)))))

    – Alan Curry

    28. Juli 2012 um 0:14 Uhr

  • @bitmask, mathematische Funktionen werden normalerweise direkt in asm implementiert.

    – SingerOfTheFall

    10. August 2012 um 9:40 Uhr

  • Ich habe es gerade in meine js-Konsole eingegeben, es funktioniert nicht mit einer Nummer höher als 709 (möglicherweise ist es nur mein System) Math.log(Math.pow(Math.exp(709),0.33333333333333333333)) und Math.log(Math.pow(Math.exp(709),Math.sin(Math.atan2(1,Math.sqrt(8)))))

    – Shaheer

    30. August 2012 um 13:12 Uhr


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

    int num = 1234567;
    int den = 3;
    div_t r = div(num,den); // div() is a standard C function.
    printf("%d\n", r.quot);

    return 0;
}

Sie können (plattformabhängig) Inline-Assembly verwenden, z. B. für x86: (funktioniert auch für negative Zahlen)

#include <stdio.h>

int main() {
  int dividend = -42, divisor = 5, quotient, remainder;

  __asm__ ( "cdq; idivl %%ebx;"
          : "=a" (quotient), "=d" (remainder)
          : "a"  (dividend), "b"  (divisor)
          : );

  printf("%i / %i = %i, remainder: %i\n", dividend, divisor, quotient, remainder);
  return 0;
}

Verwenden Itoa in einen Basis-3-String umzuwandeln. Lassen Sie den letzten fallen Trit und zurück zur Basis 10 konvertieren.

// Note: itoa is non-standard but actual implementations
// don't seem to handle negative when base != 10.
int div3(int i) {
    char str[42];
    sprintf(str, "%d", INT_MIN); // Put minus sign at str[0]
    if (i>0)                     // Remove sign if positive
        str[0] = ' ';
    itoa(abs(i), &str[1], 3);    // Put ternary absolute value starting at str[1]
    str[strlen(&str[1])] = '\0'; // Drop last digit
    return strtol(str, NULL, 3); // Read back result
}

  • @cshemby Das wusste ich eigentlich nicht itoa könnte eine beliebige Basis verwenden. Wenn Sie eine vollständig funktionierende Implementierung mit itoa Ich werde positiv abstimmen.

    – Mystisch

    27. Juli 2012 um 19:54 Uhr


  • Die Umsetzung wird enthalten / und %… 🙂

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    22. August 2012 um 6:39 Uhr

  • @R .. So funktioniert die Implementierung von printf zur Anzeige Ihres Dezimalergebnisses.

    – Damian Yerrick

    21. September 2016 um 16:39 Uhr

1428330cookie-checkTeilen Sie eine Zahl durch 3, ohne die Operatoren *, /, +, -, % zu verwenden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy