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: 84, 42, 21, 64, 32, 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