Taller 3. Uso de Idioms y su rendimiento

Implemente el ejemplo de representación de números dado en virtual constructors para tratar de igual manera los siguientes tipos de datos:
- int
- long
- float
- double
- Complex (un número con parte real e imaginaria distinta de cero)
- Imaginary (un número complejo con parte real igual a cero e imaginaria distinta de cero)
- LargeInt (números enteros con un número arbitrario de cifras significativas)

El objetivo de la implementación es solucionar problemas que pueden existir en los siguientes temas
 

Use los idioms que considere pertinentes en la implementación de una solución eficiente. La entrega debe incluir los comentarios a los puntos descritos, un análisis de las ventajas y desventajas de la implementación y las medidas de eficiencia para el siguiente programa principal:
 
 
const int MAX=50;
char* getlargeInt( ); 
// Retorna un nuevo número entero largo de máximo 30 digitos y mínimo 20
int main()
{
  // Calcule la memoria usada e imprima ese dato en formato ("Dato 1 = %ld\n")

  Number ints[MAX];
  Number longs[MAX];
  Number floats[MAX];
  Number doubles[MAX];
  Number complexes[MAX];
  Number imaginaries[MAX];
  Number largeints[MAX];

  // Calcule la memoria usada e imprima ese dato en formato ("Dato 2 = %ld\n")

  for( int index=0; index<MAX; index++ )
  {
    ints[index] = index + 100;
    longs[index] = index + 50000L;
    floats[index] = index + 200.3;
    doubles[index] = index + 40.1234567;
    complexes[index] = Number( ints[index], longs[index] );
    imaginaries[index] = Number( 0, floats[index] );
    largeints[index] = getLargeInt( );
  }
  // Calcule la memoria usada e imprima ese dato en formato ("Dato 3 = %ld\n")

  Number resp[MAX];
  for( int index=0; index<MAX; index++ )
  {
    resp[index] = longs[index]/1000 - ints[index];
    cout << resp[nindex];
  }
  // Calcule la memoria usada e imprima ese dato en formato ("Dato 4 = %ld\n")
  for( int index=0; index<MAX; index++ )
  {
    resp[index] = floats[index] - 0.3;
    cout << resp[nindex];
  }
  // Calcule la memoria usada e imprima ese dato en formato ("Dato 5 = %ld\n")
  for( int index=0; index<MAX; index++ )
  {
    resp[index] = complexes[index] - Number( 0, longs[index]);
    cout << resp[nindex];
  }
  // Calcule la memoria usada e imprima ese dato en formato ("Dato 6 = %ld\n")
  for( int index=0; index<MAX; index++ )
  {
    resp[index] = imaginaries[index] - Number( 0, floats[index] );
    cout << resp[nindex];
  }
  // Calcule la memoria usada e imprima ese dato en formato ("Dato 7 = %ld\n")
  Number div( "200000000000000" );
  for( int index=0; index<MAX; index++ )
  {
    resp[index] = largeints[index]/div + doubles[index];
    cout << resp[nindex];
  }
  // Calcule la memoria usada e imprima ese dato en formato ("Dato 8 = %ld\n")
  return 0;
}
 
Nota: la impresión en pantalla del número debe incluir un indicativo de su tipo.