2—Hailstone Sequences [12 marks]
A hailstone sequence is a sequence of integers found by applying the following rule:
Hailstone Iteration: For an integer n in a hailstone sequence, the next item in the sequence is
• 3n + 1 if n is odd, or
• n / 2 if n is even.
For example, the hailstone sequence starting at 6 is 6 ⇒ 3 ⇒ 10 ⇒ 5 ⇒ 16 ⇒ 8 ⇒ 4 ⇒ 2 ⇒ 1. The
sequence ends when 1 is reached. The name "hailstone sequence" stems from the way the values in the
sequence go up and down, as a hailstone does in the clouds before it falls to earth. Collatz (1937)
conjectured that for any starting integer, 1 would eventually be reached. So far there is no proof, making
the Collatz conjecture a famous unresolved problem in mathematics.
Write a complete Java program that will:
1) prompt the user to enter an integer N (in this document we call the input number N, but of course
in your program it must have a proper identifier);
2) scan the integers from 1 to N, where N is the user’s input, and find the hailstone sequence starting
at each integer and ending at 1 (see the example below);
3) determine the largest hailstone number in each sequence, and the hailstone sequence containing
the largest number overall;
4) print out the hailstone sequence with the largest number.
For example, if N = 5, the following hailstone sequences will be produced:
1: 1 [highest number: 1]
2: 2 ⇒ 1 [highest number: 2]
3: 3 ⇒ 10 ⇒ 5 ⇒ 16 ⇒ 8 ⇒ 4 ⇒ 2 ⇒ 1 [highest number: 16]
4: 4 ⇒ 2 ⇒ 1 [highest number: 4]
5: 5 ⇒ 16 ⇒ 8 ⇒ 4 ⇒ 2 ⇒ 1 [highest number: 16]
The highest number reached is 16. It appears in sequences for starting numbers 3 and 5. Where two
sequences have the same largest hailstone number, choose the one with the smaller starting number. In
this case the starting number 3 gives the largest hailstone number.
The structure of your program should look like this:
That is, main calls getPositiveInt to input from the user the maximum starting number of interest. In
the call to getPositiveInt, use an upper bound of one million. Then main calls hailstoneMax N
times in a loop to calculate the max hailstone number for each starting number from 1 to N. The method
main itself determines which starting number gives the maximum hailstone number overall. It calls
hailstoneSequence once to generate a String containing the entire sequence for this maximum, and
then it prints the sequence out. Finally main calls sayTheEnd to print out the programmer’s name and
the date, and to say the program has finished.
What do these methods do in detail?
public static int getPositiveInt(final String PROMPT, final int BOUND):
This method calls JOptionPane.showInputDialog, using the PROMPT passed down as a
parameter. It reads in a String from the user. It removes blanks from the String as described in
the last assignment. Then it converts the String without blanks into an int. If the int is
between 1 and BOUND inclusive (that is, 1 and BOUND are acceptable inputs as well as any integer
between them), getPositiveInt returns the input int to the calling program. If not, it prompts
the user again, with a warning that states the allowable bounds. It will only prompt three times,
after which it returns 1 if the input is still not valid. To document what it is doing,
getPositiveInt prints to System.out both the prompt message and user’s input each time.
public static long hailstoneMax(final int START): This method generates the
entire hailstone sequence starting at START and ending at 1. Along the way it determines the
COMP 1010 Winter 2010 Assignment 3 Page 4 of 6
maximum hailstone number encountered. It
returns only that number. The returned value
must be a long because an int is not big
enough to hold some of the values to be
generated. Do all the computations in this
method using long arithmetic (see sidebar). In
generating the sequence, hailstoneMax uses
the hailstone iteration given at the beginning of
this question many times. It should call the
method hailstoneNext to compute the next
number in the sequence each time.
public static long
hailstoneNext(long current): This
method applies the hailstone iteration given at
the beginning of this question. Given the current
hailstone number, it generates the next one,
either by dividing by 2, or by multiplying by 3
and adding 1. Then it returns the next value. It
uses long arithmetic throughout.
public static String
hailstoneSequence(final int START):
This method generates the entire hailstone
sequence starting at START and ending at 1. It
concatenates all the hailstone numbers together
into a String, each pair separated by " ==> ".
public static void sayTheEnd( ): This
method simply produces the final output that
terminates the program. It has no parameters, so
the brackets are empty. It is void, meaning it
does not return a value. You can include the
method you developed for the last assignment, or
you can call a method in another class, as you did
in question 3 of the last assignment. It must be
called, but the code for it will not be marked.
Hand-in: Submit your .java file. Also, submit two sets of output using the following inputs (including the
1 000 000