702 Stimmen

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

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

Die Zahl kann positiv oder negativ sein.

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?

8voto

Amir Saniyan Punkte 12082
int div3(int x)
{
  int reminder = abs(x);
  int result = 0;
  while(reminder >= 3)
  {
     result++;

     reminder--;
     reminder--;
     reminder--;
  }
  return result;
}

3 Stimmen

++ und -- Operatoren unterscheiden sich von + und - Operatoren! In Assemblersprache gibt es zwei Befehle ADD und INC, die nicht die gleichen Opcodes haben.

7voto

Peter Olson Punkte 130102

Wäre es Betrug, den / Operator "hinter den Kulissen" zu verwenden, indem man eval und Zeichenkettenverkettung verwendet?

Zum Beispiel, in Javacript, kannst du tun

function div3 (n) {
    var div = String.fromCharCode(47);
    return eval([n, div, 3].join(""));
}

7voto

PermanentGuest Punkte 5137

Nicht überprüft, ob diese Antwort bereits veröffentlicht wurde. Wenn das Programm für Fließkommazahlen erweitert werden muss, können die Zahlen mit 10*Anzahl der benötigten Präzision multipliziert werden und dann kann der folgende Code erneut angewendet werden.

#include 

int main()
{
    int aNumber = 500;
    int gResult = 0;

    int aLoop = 0;

    int i = 0;
    for(i = 0; i < aNumber; i++)
    {
        if(aLoop == 3)
        {
           gResult++;
           aLoop = 0;
        }  
        aLoop++;
    }

    printf("Ergebnis von %d / 3 = %d", aNumber, gResult);

    return 0;
}

7voto

wildplasser Punkte 41104

Dies sollte für jeden Teiler funktionieren, nicht nur für drei. Derzeit nur für nicht signierte, aber die Erweiterung auf signierte sollte nicht so schwierig sein.

#include 

unsigned sub(unsigned two, unsigned one);
unsigned bitdiv(unsigned top, unsigned bot);
unsigned sub(unsigned two, unsigned one)
{
unsigned bor;
bor = one;
do      {
        one = ~two & bor;
        two ^= bor;
        bor = one<<1;
        } while (one);
return two;
}

unsigned bitdiv(unsigned top, unsigned bot)
{
unsigned result, shift;

if (!bot || top < bot) return 0;

for(shift=1;top >= (bot<<=1); shift++) {;}
bot >>= 1;

for (result=0; shift--; bot >>= 1 ) {
        result <<=1;
        if (top >= bot) {
                top = sub(top,bot);
                result |= 1;
                }
        }
return result;
}

int main(void)
{
unsigned arg,val;

for (arg=2; arg < 40; arg++) {
        val = bitdiv(arg,3);
        printf("Arg=%u Val=%u\n", arg, val);
        }
return 0;
}

6voto

defhlt Punkte 1757

Das Erste, das ich mir ausgedacht habe.

irb(main):101:0> div3 = -> n { s = '%0' + n.to_s + 's'; (s % '').gsub('   ', ' ').size }
=> #
irb(main):102:0> div3[12]
=> 4
irb(main):103:0> div3[666]
=> 222

BEARBEITEN: Entschuldigung, ich habe das Tag C nicht bemerkt. Aber du kannst die Idee zur Zeichenfolgenformatierung nutzen, denke ich...

CodeJaeger.com

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.

Powered by:

X