Imprimir 1 a 100 en C++ sin bucles y recursividad

Podemos imprimir del 1 al 100 sin usar bucles y recursividad utilizando tres enfoques que se analizan a continuación:

1) Metaprogramación de plantillas : las plantillas en C++ permiten tipos que no son de datos también como parámetros. Sin tipo de datos significa un valor, no un tipo de datos. 

Ejemplo:

CPP

// CPP Program to print 1 to 100
// without loops and recursion
#include <iostream>
using namespace std;
 
template <int N> class PrintOneToN {
public:
    static void print()
    {
        PrintOneToN<N - 1>::print();
       
        // Note that this is not recursion
        cout << N << endl;
    }
};
 
template <> class PrintOneToN<1> {
public:
    static void print() { cout << 1 << endl; }
};
 
// Driver Code
int main()
{
    const int N = 100;
    PrintOneToN<N>::print();
    return 0;
}

Producción

1
2
3
..
..
98
99
100

El programa imprime todos los números del 1 al n sin usar un bucle ni recursividad. 

Explicación: 

  • En el programa anterior, N se pasa como un valor que no es un tipo de datos. Se crea una nueva instancia de una clase genérica para cada parámetro y estas clases se crean en tiempo de compilación.
  • Aquí, cuando el compilador ve la declaración «PrintOneToN<>::print()» con N = 100, crea una instancia PrintOneToN<100>.
  • En la función PrintOneToN<100>::print(), se llama a otra función PrintOneToN<99>::print(), por lo que se crea una instancia PrintOneToN<99>.
  • De manera similar, se crean todas las instancias desde PrintOneToN<100> hasta PrintOneToN<2>. PrintOneToN<1>::print() ya está allí e imprime 1.
  • La función PrintOneToN<2> imprime 2 y así sucesivamente. Por lo tanto, obtenemos todos los números del 1 al N impresos en la pantalla.

2) El siguiente es otro enfoque que usa clases y variables estáticas ,  

CPP

// CPP Program to print 1 to 100 without loops and recursion
#include <iostream>
using namespace std;
 
class A {
public:
    static int a;
    A() { cout << a++ << endl; }
};
 
int A::a = 1;
 
// Driver Code
int main()
{
    int N = 100;
    A obj[N];
    return 0;
}

Producción

1
2
3
..
..
98
99
100

La salida de este programa es la misma que la del programa anterior. 

Explicación: En el programa anterior, la clase A tiene una variable estática ‘a’, que se incrementa con cada instancia de A. El constructor predeterminado de la clase A imprime el valor de ‘a’. Cuando creamos una array de objetos de tipo A, se llama al constructor predeterminado para todos los objetos uno por uno. Por lo tanto, obtenemos todos los valores del 1 al 100 impresos en la pantalla.

3) Uso de la palabra clave goto : la declaración goto es una declaración de salto y se puede usar para saltar de cualquier lugar a cualquier lugar dentro de una función.

Ejemplo:

C++

// CPP Program to print 1 to 100
// without loops and recursion
#include <iostream>
 
// Driver Code
int main()
{
    short sum = 0;
 
update:
    sum++;
    std::cout << sum << std::endl;
 
    if (sum == 100)
        return 0;
    goto update;
}

Producción

1
2
3
..
..
98
99
100

La salida de este programa es la misma que la del programa anterior. 

Explicación: En el programa anterior, la palabra clave goto es saltar nuevamente a la etiqueta denominada actualización. El valor de ‘suma’ se imprime y se incrementa con cada llamada. El programa deja de ejecutarse una vez que la variable suma es igual a 100. De esta forma, obtenemos todos los valores del 1 al 100 impresos en la consola. 

Complejidad temporal : O(1) 
Espacio auxiliar : O(1)

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *