Dividir un número por 3 sin utilizar los operadores *, /, +, -, %

Resuelto asked hace 12 años • 48 respuestas

¿Cómo dividirías un número entre 3 sin usar los operadores *, /, +, -, %?

El número puede estar firmado o sin firmar.

 avatar Jul 28 '12 02:07
Aceptado

Esta es una función simple que realiza la operación deseada. Pero requiere el +operador, así que todo lo que queda por hacer es sumar los valores con operadores de bits:

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

Como Jim comentó, esto funciona porque:

  • n = 4 * a + b
  • n / 3 = a + (a + b) / 3
  • Entonces sum += a, n = a + by iterar

  • Cuando a == 0 (n < 4), sum += floor(n / 3);es decir 1,if n == 3, else 0

qwertz avatar Jul 27 '2012 19:07 qwertz

Condiciones idiotas exigen una solución idiota:

#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 también se necesita la parte decimal, simplemente declara resultcomo doubley agrégale el resultado de fmod(number,divisor).

Explicación de cómo funciona.

  1. Los bytes fwritede escritura number(el número es 123456 en el ejemplo anterior).
  2. rewindrestablece el puntero del archivo al frente del archivo.
  3. freadlee un máximo de number"registros" de divisorlongitud del archivo y devuelve el número de elementos que leyó.

Si escribe 30 bytes y luego vuelve a leer el archivo en unidades de 3, obtendrá 10 "unidades". 30/3 = 10

Matteo Italia avatar Jul 27 '2012 19:07 Matteo Italia
log(pow(exp(number),0.33333333333333333333)) /* :-) */
Alan Curry avatar Jul 27 '2012 19:07 Alan Curry
#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;
}
 avatar Jul 27 '2012 20:07