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: 166, 83, 250, 125, 376, 188, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 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

© 2004-17 robson | cc unless stated