Wie würden Sie eine Zahl durch 3 teilen, ohne zu verwenden *
, /
, +
, -
, %
Betreiber?
Die Nummer kann signiert oder unsigniert sein.
Wie würden Sie eine Zahl durch 3 teilen, ohne zu verwenden *
, /
, +
, -
, %
Betreiber?
Die Nummer kann signiert oder unsigniert sein.
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
fwrite
schreibt number
Bytes (im obigen Beispiel ist die Zahl 123456).rewind
setzt den Dateizeiger auf den Anfang der Datei zurück.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
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