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.
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 + b
y iterarCuando
a == 0 (n < 4)
,sum += floor(n / 3);
es decir 1,if n == 3, else 0
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 result
como double
y agrégale el resultado de fmod(number,divisor)
.
Explicación de cómo funciona.
- Los bytes
fwrite
de escrituranumber
(el número es 123456 en el ejemplo anterior). rewind
restablece el puntero del archivo al frente del archivo.fread
lee un máximo denumber
"registros" dedivisor
longitud 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
log(pow(exp(number),0.33333333333333333333)) /* :-) */
#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;
}