Wie würden Sie eine Zahl durch 3 teilen, ohne die *
, /
, +
, -
, %
Operatoren zu verwenden?
Die Zahl kann positiv oder negativ sein.
Wie würden Sie eine Zahl durch 3 teilen, ohne die *
, /
, +
, -
, %
Operatoren zu verwenden?
Die Zahl kann positiv oder negativ sein.
Lösung mit der fma() Bibliotheksfunktion, funktioniert für jede positive Zahl:
#include
#include
int main()
{
int number = 8;//Irgendeine positive Zahl
int temp = 3, result = 0;
while(temp <= number){
temp = fma(temp, 1, 3); //fma(a, b, c) ist eine Bibliotheksfunktion und gibt (a*b) + c zurück.
result = fma(result, 1, 1);
}
printf("\n\n%d durch 3 geteilt = %d\n", number, result);
}
Verwenden Sie cblas, das als Teil des Accelerate-Frameworks von OS X enthalten ist.
[02:31:59] [william@relativity ~]$ cat div3.c
#import
#import
int main() {
float Multiplikator = 123456.0;
float Faktor = 0.333333;
printf("%f * %f == ", Multiplikator, Faktor);
cblas_sscal(1, Faktor, &Multiplikator, 1);
printf("%f\n", Multiplikator);
}
[02:32:07] [william@relativity ~]$ clang div3.c -framework Accelerate -o div3 && ./div3
123456.000000 * 0.333333 == 41151.957031
Nun, das war nur ein Implementierungsdetail, damit ich es als 3.0 / 1.0 anstelle von 0.333333 eingeben konnte, aber ich sollte mich an die Regeln halten. Behoben!
Ursprünglich hatte ich es als 3.0 / 1.0, was in meinem Test funktioniert hat. Durch die Verwendung einer Zahl mit höherer Genauigkeit sollte ein akzeptables Ergebnis erzielt werden. gist.github.com/3401496
Okay, ich denke, wir sind uns alle einig, dass dies kein reales Problem ist. Also nur zum Spaß, hier ist wie man es mit Ada und Multithreading macht:
with Ada.Text_IO;
procedure Divide_By_3 is
protected type Divisor_Type is
entry Poke;
entry Finish;
private
entry Release;
entry Stop_Emptying;
Emptying : Boolean := False;
end Divisor_Type;
protected type Collector_Type is
entry Poke;
entry Finish;
private
Emptying : Boolean := False;
end Collector_Type;
task type Input is
end Input;
task type Output is
end Output;
protected body Divisor_Type is
entry Poke when not Emptying and Stop_Emptying'Count = 0 is
begin
requeue Release;
end Poke;
entry Release when Release'Count >= 3 or Emptying is
New_Output : access Output;
begin
if not Emptying then
New_Output := new Output;
Emptying := True;
requeue Stop_Emptying;
end if;
end Release;
entry Stop_Emptying when Release'Count = 0 is
begin
Emptying := False;
end Stop_Emptying;
entry Finish when Poke'Count = 0 and Release'Count < 3 is
begin
Emptying := True;
requeue Stop_Emptying;
end Finish;
end Divisor_Type;
protected body Collector_Type is
entry Poke when Emptying is
begin
null;
end Poke;
entry Finish when True is
begin
Ada.Text_IO.Put_Line (Poke'Count'Img);
Emptying := True;
end Finish;
end Collector_Type;
Collector : Collector_Type;
Divisor : Divisor_Type;
task body Input is
begin
Divisor.Poke;
end Input;
task body Output is
begin
Collector.Poke;
end Output;
Cur_Input : access Input;
-- Eingabewert:
Number : Integer := 18;
begin
for I in 1 .. Number loop
Cur_Input := new Input;
end loop;
Divisor.Finish;
Collector.Finish;
end Divide_By_3;
Dies ist mit C markiert und war seit dem ersten Tag so. Deine Antwort ist nicht zum Thema.
Das Ausgraben alter, geschlossener Fragen und das Schreiben solcher Kommentare zu den Antworten ist verschwendete Zeit für uns beide. Du musst den Kommentar schreiben und ich sehe die Benachrichtigung, klicke darauf und muss den Kontext erfassen. Es wird mich nicht weiterbilden (ich kann mich nicht einmal daran erinnern, das geschrieben zu haben) und die Antwort wird sich dadurch nicht verbessern (du denkst doch nicht ernsthaft, dass ich das nach C übersetzen werde). Was versuchst du zu erreichen?
Das Problem ist, dass die Frage nicht geschlossen ist und daher eine Flut von off-topic, minderwertigen Antworten ausgelöst hat und weiterhin auslöst. Ich versuche die Qualität der Webseite zu verbessern, indem ich die Antworten durchgehe, nicht-Antworten markiere und off-topic Antworten downvote. Übrigens ist alles Community-Wiki, sodass kein Ruf beeinträchtigt wird.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
2 Stimmen
Dies ist schwer, da Sie
+
oder-
nicht verwenden können. Sie könnten technisch gesehen einen Addierer nur unter Verwendung von logischen Operatoren implementieren...1 Stimmen
Sind Sie zu 100% sicher, dass
+
in der Liste der nicht verwendbaren Elemente stand?0 Stimmen
Ist der unäre
+
,-
erlaubt?8 Stimmen
Der identifizierte Duplikat ist kein Duplikat. Beachten Sie, dass mehrere Antworten hier weder Bitverschiebung noch Addition verwenden, da diese Frage keine Einschränkung auf diese Operationen vorschrieb.
4 Stimmen
BTW: Die andere Frage handelte davon, ob eine Zahl durch 3 teilbar ist. Diese Frage handelt davon, durch 3 zu dividieren.
0 Stimmen
Ich wäre interessiert daran, einige auf Mengen basierende Lösungen für das Problem zu sehen (egal wie ineffizient sie sein mögen). Ein "einfacher" rekursiver CTE sollte ausreichen, denke ich. War die Frage immer mit den Tags
c
undbitwise
markiert?1 Stimmen
Für Interessierte habe ich dieses auf codegolf.stackexchange veröffentlicht.
3 Stimmen
Vielleicht meinte der Interviewer, zu fragen "Wie teilen Sie durch 2, ohne blah blah blah zu verwenden". Das wäre eine vernünftige Frage, die die meisten Entwickler beantworten können sollten.
4 Stimmen
X /= 3; verwendet nicht den /-Operator, /= ist ein anderer Operator.
28 Stimmen
Diese Frage ist offtopic für SO. Sie gehört zu codegolf.stackexchange.com
0 Stimmen
Verwenden Sie die
div_t
Struktur, und dann erhalten Sie diequot
undrem
Mitglieder.3 Stimmen
Ich stimme dafür, diese Frage als off-topic zu schließen, da sie zu weit gefasst und off-topic ist, und auf codegolf.stackexchange.com besser aufgehoben wäre. Die Qualität der aktuellen Antworten ist enttäuschend und dieser Beitrag hat insgesamt sehr wenig Wert.
0 Stimmen
Hinweis: Die Verwendung von sprachspezifischen Herausforderungen wird auf PPCG stark abgeraten. PPCG ist kein Ort, um jede off-topic, aber lustige Stack Overflow-Frage zu veröffentlichen.
0 Stimmen
Ähnliche Antworten sind unter stackoverflow.com/questions/171301 zu finden.