Schreibe eine Funktion, um eine Zahl durch 3 zu teilen, ohne die Operatoren /,% und * zu verwenden. itoa () verfügbar?

8

Ich habe versucht, es selbst zu lösen, aber ich konnte keine Ahnung bekommen.

Bitte helfen Sie mir, das zu lösen.

    
SIVA 15.01.2010, 11:13
quelle

17 Antworten

14

Soll angenommen werden , ito () für diese Zuweisung zu verwenden? Denn dann könnten Sie das verwenden, um in eine Basis-3-Zeichenfolge zu konvertieren, das letzte Zeichen zu löschen und dann wieder auf Basis 10 wiederherzustellen.

    
stuartd 15.01.2010 12:05
quelle
10

Verwendung der mathematischen Beziehung:

%Vor%

Wir haben

%Vor%

Wenn Sie nur 32-Bit-Ganzzahlen verwenden können,

%Vor%

Die 4/3 - 2/3 -Behandlung wird verwendet, weil x >> 1 % floor(x/2) anstelle von round(x/2) ist.

    
kennytm 15.01.2010 12:04
quelle
9

x / 3 = e ^ (ln (x) - ln (3))

    
mbeckish 15.01.2010 19:29
quelle
8

BEARBEITEN: Ups, ich habe die Frage des Titels falsch gelesen. Multiplikator ist ebenfalls verboten.

Jedenfalls glaube ich, dass es gut ist, diese Antwort nicht für diejenigen zu löschen, die nicht wussten, wie man durch zwei Konstanten dividiert.

Die Lösung besteht darin, mit einer magischen Zahl zu multiplizieren und dann die 32 am weitesten links stehenden Bits zu extrahieren:

dividiere durch 3 entspricht der Multiplikation mit 1431655766 und dann der Verschiebung um 32 in C:

%Vor%

Siehe Hacker's Delight Magic Zahlenrechner .

    
Gregory Pakosz 15.01.2010 11:28
quelle
4

Hier ist eine in C ++ implementierte Lösung:

%Vor%

; -)

    
stakx 15.01.2010 12:34
quelle
3
%Vor%

EDIT: Getestet und funktioniert einwandfrei: (

Ich hoffe, das hat geholfen. : -)

    
Richie 15.01.2010 11:27
quelle
1

Klingt wie Hausaufgaben:)

Ich Bild Sie können eine Funktion schreiben, die eine Zahl iterativ teilt. Z.B. Sie können modellieren, was Sie mit einem Stift und einem Stück Papier tun, um Zahlen zu teilen. Oder Sie können Shift-Operatoren und + verwenden, um herauszufinden, ob Ihre Zwischenergebnisse zu klein / groß sind und iterativ Korrekturen anwenden. Ich werde den Code aber nicht aufschreiben ...

    
user231967 15.01.2010 11:17
quelle
1
%Vor%     
user240709 20.01.2010 06:43
quelle
1
%Vor%     
Kiran KK 29.07.2011 14:13
quelle
1

Sie können eine Eigenschaft aus den Zahlen verwenden: Eine Zahl ist durch 3 teilbar, wenn ihre Summe durch 3 teilbar ist. Nimm die einzelnen Ziffern von itoa () und verwende dann switch function für sie rekursiv mit Additionen und itoa ()

Hoffe, das hilft

    
gvitz 23.12.2011 20:20
quelle
1

Das ist sehr einfach, so einfach, ich werde nur auf die Antwort hinweisen -

Einfache boolesche Logikgatter (und, oder, nicht, xor, ...) tun keine Division. Trotz dieses Handicaps können CPUs spalten. Ihre Lösung liegt auf der Hand: Finden Sie eine Referenz, die Ihnen erklärt, wie Sie einen Divisor mit boolescher Logik erstellen und Code schreiben, um das zu implementieren.

    
High Performance Mark 15.01.2010 11:53
quelle
0

Wie wäre es damit, in einer Art Python-ähnlichem Pseudocode? Es teilt die Antwort in einen ganzzahligen Teil und einen Bruchteil. Wenn Sie es in eine Gleitkommadarstellung konvertieren wollen, bin ich mir nicht sicher, wie das am besten funktioniert.

%Vor%

Beachten Sie, dass dies bei negativen Zahlen nicht funktioniert. Um das zu beheben, müssen Sie den Algorithmus ändern:

%Vor%     
Hannes Ovrén 15.01.2010 11:27
quelle
0

für die positive ganzzahlige Division

%Vor%     
jk. 15.01.2010 11:27
quelle
0
%Vor%     
fesno 15.01.2010 18:34
quelle
0

Konvertiere 1/3 in binär

also 1/3 = 0.01010101010101010101010101

und dann einfach "multiplizieren" mit dieser Zahl mit shifts und sum

    
Luka Rahne 16.01.2010 11:11
quelle
0

Es gibt eine Lösung auf ​​Ссылка

%Vor%

Bitte sag etwas darüber, danke:)

    
0xB2CC 21.10.2012 15:13
quelle
-1

Langsam und naiv, aber es sollte funktionieren, wenn ein exakter Divisor existiert. Zusatz ist erlaubt, oder?

%Vor%

Die Erweiterung für Teilteiler wird dem Leser als Übung überlassen. Grundsätzlich Test für +1 und +2 denke ich ...

    
Wouter Lievens 15.01.2010 11:17
quelle

Tags und Links