public class ThreeN2 {

   /*
       A program that computes and displays several 3N+1
       sequences.  Starting values for the sequences are
       input by the user.  Terms in a sequence are printed
       in columns, with several terms on each line of output.
       After a sequence has been displayed, the number of
       terms in that sequence is reported to the user.
   */
 
   final static int NUMBER_OF_COLUMNS = 5;  // constant specifying number
                                          // of terms on each output line
   
   final static int COLUMN_WIDTH = 8;  // constant specifying the width,
                                      // in number of characters, of each
                                      // column in the output
   

   public static void main(String[] args) {

      TextIO.putln("This program will print out 3N+1 sequences");
      TextIO.putln("for starting values that you specify.");
      TextIO.putln();
      
      int K = 0;
      do {
         TextIO.putln("Enter a starting value;");
         TextIO.put("To end the program, enter 0: ");
         K = TextIO.getInt();  // get starting value from user
         if (K > 0)   // print sequence, but only if K is > 0
            Print3NSequence(K);
      } while (K > 0);   // continue only if K > 0

   } // end main()


   static void Print3NSequence(int startingValue) {

      // Prints a 3N+1 sequence to standard output, using
      // startingValue as the initial value of N.
      // The value of startingValue must be a
      // positive integer.

      int N = startingValue;  // N represents a term in the sequence.
      int count = 1;   // count is the number of terms found.
      int onLine = 1;  // onLine counts terms on current output line.

      TextIO.putln("The 3N+1 sequence starting from " + N);
      TextIO.putln();
      TextIO.put(N, COLUMN_WIDTH);  // print initial term of sequence

      while (N > 1) {
          N = nextN(N);  // compute next term
          count++;   // count this term
          if (onLine == NUMBER_OF_COLUMNS) { // if current output line is full
             TextIO.putln();  // then output a carriage return
             onLine = 0;   // and note that there are no terms on the new line
          }
          TextIO.put(N, COLUMN_WIDTH);  // print this term
          onLine++;   // add 1 to record of number of terms on this line
      }

      TextIO.putln();  // end current line of output
      TextIO.putln();  // and then add a blank line
      TextIO.putln("There were " + count + " terms in the sequence.");

   }  // end of Print3NSequence()
   
   
   static int nextN(int currentN) {
       // computes and returns the next term in a 3N+1 sequence
       if (currentN % 2 == 1)
          return 3 * currentN + 1;
       else
          return currentN / 2;
   }  // end of nextN()
   
} // end of class ThreeN
 
