Ακολουθία αριθμών Collatz

Το περίφημο πρόβλημα για το οποίο ο Paul Erdős δήλωσε πως "τα μαθηματικά δεν είναι έτοιμα για τέτοια προβλήματα".

Δίνεται ένας θετικός ακέραιος αριθμός a ως αρχική τιμή μιας ακολουθίας. Υπολογίζουμε τους όρους της ακολουθίας ως εξής:

Αν $$a_n$$ άρτιος τότε:
$$ a_{n+1} = a_{n}/2 $$

Αν $$a_n$$ περιττός τότε:
$$ a_{n+1} = 3a_{n}+1 $$

Οι τιμές της ακολουθίας, κάποια στιγμή, θα καταλήξουν στο 1. Από εκεί και μετά οι τιμές της επαναλαμβάνουν το μοτίβο 1,4,2,1 επ άπειρον. Να γραφεί ένα πρόγραμμα που να δέχεται μια αρχική τιμή (θετικό ακέραιο) και να υπολογίζει και τυπώνει τις τιμές της ακολουθίας μέχρι να βρεθεί η μονάδα.

 
/*  Hailstone numbers - Collatz conjecture
    http://en.wikipedia.org/wiki/Collatz_conjecture
    http://mathworld.wolfram.com/CollatzProblem.html
*/

#include <iostream>

using namespace std;

int main()
{
    int a, i = 0;
    cout << "Give me a positive integer: ";
    cin >> a;

    // stop if a <= 0
    if ( a<=0 )
    {
        cout << "I asked for a positive integer" << endl;
        cout << "Program terminates here" << endl;
        return 0;
    }

    // loop while a != 1
    cout << "i" << "\t" << "a" << endl;
    cout << "--------------\n";
    cout << i << "\t" << a << endl;
    while (a != 1)
    {
        if (a%2 == 0)
        {
            a = a/2;
        }
        else
        {
            a = 3*a + 1;
        }
        ++i;
        cout << i << "\t" << a << endl;
    }

    return 0;
}

Συνδεθείτε για περισσότερες δυνατότητες αλληλεπίδρασης,
σχολιασμοί, εξωτερικοί σύνδεσμοι, βοήθεια, ψηφοφορίες, αρχεία, κτλ.

Creative Commons License
Εκπαιδευτικό υλικό από τον Αθανάσιο Σταυρακούδη σας παρέχετε κάτω από την άδεια Creative Commons Attribution-NonCommercial-ShareAlike 4.0 License.
Σας παρακαλώ να ενημερωθείτε για κάποιους επιπλέον περιορισμούς
http://stavrakoudis.econ.uoi.gr/stavrakoudis/?iid=401.