# Robson ▸ Little Red Book ▸ Hailstone numbers

## Chapter 5 - Question 2

Using a given initial positive non-zero integer it is possible to develop a sequence using the simple rules:

If the number is even then take half its value as the next term; if it is odd then make the next term equal to three times the current term plus one.

Given that the sequence will always eventually and with a 1, design a program to develop the sequence for any valid given value.

### Solution 1

`<?` `    // check if the user entered a number` `    // 0 is blocked because it makes php go unresponsive` `    // the script can easily handle numbers above a million, but to be safe i'm going to block anything higher` `    if (abs(\$_POST['input_number']) >= 1 && abs(\$_POST['input_number']) <= 1000000 && is_numeric(\$_POST['input_number']))` `        // use the positive whole version of the number supplied` `        \$number = abs(intval(\$_POST['input_number']));` `    else    ` `        // generate a random number` `        // 1 is included, although it's fairly boring` `        \$number = mt_rand(1, 200);` `        ` `    // save the number started with` `    \$sequence[] = \$number;` `    ` `    // only loop while the number isn't 1` `    while (\$number <> 1)` `    {` `        // check if the number is odd` `        if (\$number % 2)` `            \$number = (\$number * 3) + 1;` `        // it must be even` `        else` `            // divide by two` `            \$number /= 2;` `        // add the current value to the sequence` `        \$sequence[] = \$number;` `    }    ` `    ` `    // output all the numbers through the sequence` `    echo 'Sequence: ' . implode(', ', \$sequence);` `?>`

Which produces:

Sequence: 57, 172, 86, 43, 130, 65, 196, 98, 49, 148, 74, 37, 112, 56, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1
Create Hailstone Sequence

### Solution 2

C++ solution.

`#include <iostream.h>` `int main ()` `{` `  int iNumber;` `  cout << "Enter a number.\n>";` `  cin >> iNumber;` `  cout << iNumber;` `  while (iNumber > 1) {` `    if (iNumber % 2)` `      iNumber = (iNumber * 3) + 1;` `    else` `      iNumber /= 2;` `    cout << ", " << iNumber;` `  }` `  return 0;` `}`

## Log

• Mar 27, 2005 - Added solution 2.
• Feb 6, 2005 - Added solution 1.
© 2004-20 robson | cc unless stated