// lab01.cpp   (C) 2000 carlos@loria.com


#include <iostream>  // cout

int armstrong() {
/*------------------------------------------------------------*\
| Determina cuántos números son de Armstrong, desde 1 hasta N. |
|                                                              |
| Un número es de Armstrong si la suma de los cubos de los     |
| dígitos que lo componen es igual al número.                  |
|                                                              |
| Por ejemplo el número 153 es de Armstrong, pues:             |
|                                                              |
|    3     3     3                                             |
|   1  +  5  +  3  =  1^3 + 5^3 + 3^3  = 1 + 125 + 27 = 153    |
\*------------------------------------------------------------*/

    const int N = 3000;
    int numero, digito, suma, temp;

    cout << "Números encontrados  (1.." << N << ") que son de Armstrong.";
    cout << "\n";

    for (numero=1 ; numero<=N ; numero++) {  // Para cada número en [1..n]
        suma = 0;
        temp = numero;

        while (temp != 0) { // Suma de cubo de los dígitos
            digito = temp % 10;               // Ultimo digito
            suma  += (digito*digito*digito);  // Acumulo el cubo del dígito
            temp   = temp / 10;               // quito último dígito
        }

        if (suma == numero) { // Si suma de dígitos^3 igual al número
            cout << numero << " suma de los cubos de sus dígitos ";
            cout << suma << endl;
        }
    } // para cada número del intervalo [1..n]
    return 0;

} // armstrong()



#include <iostream> // cout

int armstrong_vector() { // Versión con "vector de cubos..."
/*------------------------------------------------------------*\
| Determina cuántos números son de Armstrong, desde 1 hasta N. |
|                                                              |
| Un número es de Armstrong si la suma de los cubos de los     |
| dígitos que lo componen es igual al número.                  |
|                                                              |
| Por ejemplo el número 153 es de Armstrong, pues:             |
|                                                              |
|    3     3     3                                             |
|   1  +  5  +  3  =  1^3 + 5^3 + 3^3  = 1 + 125 + 27 = 153    |
\*------------------------------------------------------------*/

    const  int N = 1+9999;

    // vectores de dígitos y cubos
    int digito [(N<10?1:(N<100?2:(N<1000?3:(N<10000?4:5))))];
    const  int Nvec = sizeof(digito) / sizeof(digito[0]);
    int  cubo [Nvec];

    int numero, suma, temp;

    int i; // indice auxiliar en dígitos
    int j; // posición inversa en el vector

    cout << "Números encontrados  (1.." << N << ") que son de Armstrong.";
    cout << "\n";

    for (numero=1 ; numero<=N ; ++numero) {  // recorre [1..n]
        suma = 0;
        temp = numero;
        i    = 0;

        while (temp != 0) { // Suma de cubo de los dígitos
            digito[i] = temp % 10;  // Ultimo digito
            cubo[i]   = digito[i] * digito[i] * digito[i];    // cubo
            suma      += cubo[i];   // Acumulo el cubo del dígito
            temp      /= 10;        // quito último dígito
            ++i;
        }

        if (suma == numero) { // Si suma de dígitos^3 igual al número
            cout << numero << " suma de los cubos de sus dígitos ";
            cout << suma << endl;
            cout << "Pues : " << numero << " = ";

            for (j=i-1; j>=0; --j) {
                cout << digito[j] << "^3";
                if (0 != j) {     // Si no es el último
                    cout << " + ";
                }
            }

            cout << " = ";
            for (j=i-1; j>=0; --j) {
                cout << cubo[j];
                if (0 != j) {  // Si no es el último
                    cout << " + ";
                }
            }
            cout << " = " << suma << "\n";
        }

    } // para cada número del intervalo [1..n]
    return 0;

} // armstrong_vector()


#include <iostream> // cout
#include <bool.h>   // false+true

bool is_armstrong (int n);

int armstrong_funcion() { // Versión con funci¢n
/*------------------------------------------------------------*\
| Determina cuántos números son de Armstrong, desde 1 hasta N. |
|                                                              |
| Un número es de Armstrong si la suma de los cubos de los     |
| dígitos que lo componen es igual al número.                  |
|                                                              |
| Por ejemplo el número 153 es de Armstrong, pues:             |
|                                                              |
|    3     3     3                                             |
|   1  +  5  +  3  =  1^3 + 5^3 + 3^3  = 1 + 125 + 27 = 153    |
\*------------------------------------------------------------*/

    const int N = 3000;
    int numero;

    cout << "Números encontrados  (1.." << N << ") que son de Armstrong.";
    cout << "\n";

    for (numero=1 ; numero<=N ; numero++) {  // Para cada número en [1..n]

        if (is_armstrong( numero )) { // Si suma de dígitos^3 igual al número
            cout << numero << " suma de los cubos de sus dígitos ";
            cout << numero << endl;
        }
    } // para cada número del intervalo [1..n]
    return 0;

} // armstrong_funcion()


bool is_armstrong(int n) {
/*------------------------------------------------------------*\
| Determina is el número "n" es o no un número de Armstrong.   |
|                                                              |
| Un número es de Armstrong si la suma de los cubos de los     |
| dígitos que lo componen es igual al número.                  |
|                                                              |
| Por ejemplo el número 153 es de Armstrong, pues:             |
|                                                              |
|    3     3     3                                             |
|   1  +  5  +  3  =  1^3 + 5^3 + 3^3  = 1 + 125 + 27 = 153    |
\*------------------------------------------------------------*/
    int suma = 0;
    int digito;
    int temp = n;

    while (temp != 0) { // Suma de cubo de los dígitos
        digito = temp % 10;               // Ultimo digito
        suma  += (digito*digito*digito);  // Acumulo el cubo del dígito
        temp   = temp / 10;               // quito último dígito
    }

    return (suma == n);  // Si suma de dígitos^3 igual al número
} // is_armstrong()



int main() {
    int ret;  // código de retorno del programa principal

    ret = armstrong();
    if (ret != 0) {
        cout << "ERROR: " << ret << "armstrong()";
    }

    ret = armstrong_funcion();
    if (ret != 0) {
        cout << "ERROR: " << ret << "armstrong_funcion()";
    }

    ret = armstrong_vector();
    if (ret != 0) {
        cout << "ERROR: " << ret << "armstrong_vector()";
    }

    return 0;
} // main()

// EOF: lab01.cpp
