Ver Mensaje Individual
  #4 (permalink)  
Antiguo 09/11/2016, 04:00
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Modificar un digito de un numero

Cita:
Iniciado por aguml Ver Mensaje
¿que cálculos va a hacer en tiempo de compilación?
Código C++:
Ver original
  1. constexpr unsigned long Exponente(int e)
  2. {
  3.   return (e>0)? 10*Exponente(e-1) : 1;
  4. }
  5.  
  6. template<int D> unsigned long Reemplazar(unsigned long valor, unsigned nuevoDigito)
  7. {
  8.   unsigned long superior = valor / Exponente(D+1);
  9.   unsigned long inferior = valor % Exponente(D);
  10.  
  11.   return (superior*10+nuevoDigito)*Exponente(D) + inferior;
  12. }

El dígito a convertir tiene que ser conocido en tiempo de compilación y da la casualidad que Exponente() está etiquetada como constexpr. En consecuencia, las llamadas Exponente(D) y Exponente(D+1) se sustituirán por su correspondiente solución en tiempo de compilación.

Cita:
Iniciado por aguml Ver Mensaje
¿Podrías explicarme el comportamiento de la función recursiva Exponente? No entiendo su funcionamiento.
Código C++:
Ver original
  1. constexpr unsigned long Exponente(int e)
  2. {
  3.   return (e>0)? 10*Exponente(e-1) : 1;
  4. }

Imaginemos que llamamos a Exponente(3). Esto es lo que sucede:
  • Exponente(3): e=3, luego e>0. Calculamos 10*Exponente(2)
  • Exponente(2): e=2, luego e>0. Calculamos 10*Exponente(1)
  • Exponente(1): e=1, luego e>0. Calculamos 10*Exponente(0)
  • Exponente(0): e=0, return 1.
  • Exponente(1): return 10*Exponente(0) = 10*1 = 10
  • Exponente(2): return 10*Exponente(1) = 10*10 = 100
  • Exponente(3): return 10*Exponente(2) = 10*100 = 1000

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.