2011-09-23 19 views
9

¿Hay alguna forma de usar código 2^power sin usar math.pow o multiplication operator. Hasta ahora,2^potencia sin usar math.pow y multiplication

He pensado utilizar 2 contadores y adiciones, pero mis programas no parecen funcionar. Aquí está mi trabajo hasta ahora.

int counter=0; // k 
int userNumber=0; // p 
int power=0; 
int sum=0; 

cout << "Enter a non-negative number: "; 
cin >> userNumber; 


while (userNumber > counter) 
{ 
    power +=2; 
    counter++; 
    power++; 
} 

sum = power - 1; 
// post-condition: Sum = 2^p -1 
cout << "The output is " << sum << endl; 
return 0; 
+0

¿Es esta una pregunta de la entrevista? ¿O tarea? La razón por la que pregunto, tenemos exactamente esa pregunta en nuestra entrevista de trabajo. Hay una respuesta realmente simple basada en una característica relativamente oscura de C++, pero si se supone que debes adivinar por ti mismo ... –

+0

@SevaAlekseyev: Me atrevo a decir que necesitas hacer preguntas más perspicaces para la entrevista. ;-) –

+1

Te sorprenderá la cantidad de personas que no lo hacen. Además, [recuerde el FizzBuzz] (http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html). –

Respuesta

-2
pow = 1; 
    while(userNumber > counter){ 
     pow = pow+pow; 
     counter++; 
    } 
+0

Me siento tan estúpido ahora; ¡Esto tiene tanto sentido! ¡Muchas gracias! – Naman

+5

@Namen: parece que no le gustaron ninguna de las respuestas de cambio de bit. ¿Había alguna razón para esto? – Mysticial

+5

Esto se parece más a un intento de calcular 2 * userNumber, no 2^userNumber. Y dado que la potencia se inicializa a cero, esto siempre genera cero. – IronMensan

4

Echa un vistazo a la función ldexp.

+0

'ldexp' es para números en coma flotante, no en pulgadas! –

+1

@Chris Jester-Young Como es math.pow(). El problema parece en realidad mucho más interesante para FP que int (me refiero a int que es realmente trivial) – Voo

+1

Supuse que estábamos generalizando a punto flotante, dado que math.pow se daba como una opción. Y porque el caso entero no es interesante. –

69

Puede calcular 2^n con manipulación de bits. Basta con hacer:

1 << n; 

Esto funciona porque la izquierda que cambia con números binarios es equivalente a multiplicar por 2.

+6

+1 por 2k, ahora ya no tendrá que obtener permiso para editar. :) – Mysticial

+0

Q.E.D: http://ideone.com/Tc7Cg – Johnsyweb

Cuestiones relacionadas