691 votes

Diviser un nombre par 3, sans l'aide d' *, /, +, -, % des opérateurs

Comment feriez-vous pour diviser un nombre par 3, sans l'aide d' *, /, +, -, %, les opérateurs?

Le nombre peut être signé ou non signé.

551voto

Coodey Points 1500

Il y a une fonction simple que j'ai trouvé ici. Mais c'est à l'aide de l' + de l'opérateur, de sorte que vous devez ajouter les valeurs avec le bit-opérateurs:

// replaces the + operator
int add(int x, int y) {
    while(x) {
        int t = (x & y) <<1;
        y ^= x;
        x = t;
    }
    return y;
}

int divideby3 (int num) {
    int sum = 0;
    while (num > 3) {
        sum = add(num >> 2, sum);
        num = add(num >> 2, num & 3);
    }
    if (num == 3)
        sum = add(sum, 1);
    return sum; 
}

Comme Jim, a commenté ceci fonctionne parce que:

  • n = 4 * a + b
  • n / 3 = a + (a + b) / 3
  • So sum += a, n = a + b, et de réitérer
  • Lors de l' a == 0 (n < 4), sum += floor(n / 3); c'est à dire 1, if n == 3, else 0

438voto

Matteo Italia Points 53117

Idiot conditions de l'appel pour un idiot solution:

#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;
}

Si la partie décimale est nécessaire, il suffit de déclarer result comme double et ajouter à cela le résultat de l' fmod(number,divisor).

Explication de la façon dont il fonctionne

  1. L' fwrite écrit number octets (numéro 123456 dans l'exemple ci-dessus).
  2. rewind réinitialise le pointeur de fichier au début du fichier.
  3. fread lit un maximum de number "dossiers" qui sont divisor de la longueur à partir du fichier et renvoie le nombre d'éléments à lire.

Si vous écrivez 30 octets puis lisez le fichier dans les unités de 3, vous bénéficiez de 10 "unités". 30 / 3 = 10

306voto

Alan Curry Points 6612
log(pow(exp(number),0.33333333333333333333)) /* :-) */

208voto

nos Points 102226
#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;
}

113voto

moooeeeep Points 10167

Utiliser l'assembleur en ligne: (fonctionne aussi pour les nombres négatifs)

#include <stdio.h>

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

  __asm__ ( "movl   %2, %%edx;"
            "sarl  $31, %%edx;"
            "movl   %2, %%eax;"
            "movl   %3, %%ebx;"
            "idivl      %%ebx;"
          : "=a" (quotient), "=d" (remainder)
          : "g"  (dividend), "g"  (divisor)
          : "ebx" );

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X