GIANT_TERNARY Output


Implementation Using int[]


//
// COMP102
// Example 5: Printing a sequence of GIANT digits
//            (Alternative version of Example 4, using int[]
//             rather than String).
//
// Paul E. Dunne 13/10/99
//
import java.io.*;
import GIANT_TERNARY;  // Ternary Digit Class
//
public class AltGiantTernaryOut
  {
  // Instantiate Input streams
  public static InputStreamReader input = new InputStreamReader(System.in);
  public static BufferedReader   keyboardInput = new BufferedReader(input);
  //
  static GIANT_TERNARY NumberForm=new GIANT_TERNARY();
  static char fore;     // For user-defined foreground symbol
  static char back;     // For user-defined background symbol
  static int InputValue;  // User supplied integer to be printed in ternary
                          // using GIANT_TERNARY representation.
  static int[] TernaryValue;   // This will contain the ternary value of InputValue
                               // as an int[] of {0,1,2} symbols.
  static int starting_point;
  //***************************************************************
  // Read user-defined foreground and background                  *
  // symbols.                                                     *
  //***************************************************************
  public static void Get_fore_and_back() throws IOException
    {
    String input_line;
    System.out.print("Foreground Character (hit return for default value):");
    input_line = keyboardInput.readLine();
    if (input_line.length()==0)   // Empty String read: use default.
     {
     fore='*';
     }
    else
      {
      fore = input_line.charAt(0);  // otherwise take first character.
      };
    System.out.print("Background Character (hit return for default value):");
    input_line = keyboardInput.readLine();
    if (input_line.length()==0)   // Empty String read: use default.
     {
     back=' ';
     }
    else
      {
      back = input_line.charAt(0);  // otherwise take first character.
      };
    }  // Get_fore_and_back
  //*************************************************************
  // Convert integer to ternary representation returning int[]  *
  // of the encoding digits as the result.                      *
  //*************************************************************
  public static int[] IntegerToTernary( final int n )
    {
    int[] res;           // Result array (can't constrain this yet)
    int tn = n;          // Save value of input parameter.
    int next_digit;      // The next ternary digit to be stored in res.
    if (tn==0)           // Have to convert 0 immediately.
      {                  // otherwise, taking log(0) in the 'else'
      res = new int[1];  // clause will cause a run-time error.
      res[0] =0;
      }
    else
      {
      res = new int[1+(int)(Math.ceil(Math.log(n)/Math.log(3)))];   // The most that will be needed
      for (int i=0; i< res.length; i++)
        {
        next_digit = tn%3;   // Find the least significant ternary digit left;
        tn=tn/3;             // and `shift' this off the current value of tn.
        res[i] = next_digit; // Store it.
        };
      };
    return res;
    }   // IntegerToTernary
  //
  // Main Method
  //
  public static void main( String[] args ) throws IOException
    {
    Get_fore_and_back();   
    NumberForm.ChangeOver(fore,back);  // Modify the instantiation to
                                       // use the new foreground/background
                                       // symbols.
    System.out.print("Enter non-negative integer value:"); 
    InputValue = new Integer(keyboardInput.readLine()).intValue();
    TernaryValue = IntegerToTernary(InputValue);
    // This conversion may leave extraneous leading 0s which
    // we don't want to print. Following code determines at which
    // position printing should begin.
    starting_point = TernaryValue.length;       // N.B. 0..length-1 is `reverse' of printing order
                                                // and so leading 0s, if present, start from length-1.
    if (TernaryValue.length> 1)                  // Make sure that if InputValue=0 then
      while (TernaryValue[starting_point-1]==0) // this *does not* get changed.
        starting_point = starting_point-1;
   
    //
    // Output Stage
    //
    // Proceeding from left-to-right output
    // the current (i'th) row of the GIANT_TERNARY digit
    // corresponding to each digit in the ternary representation
    // of the integer InputValue
    //
    System.out.println();     // Start output on a new line
    for (int i=0; i< 9; i++)
      {
      for (int j=starting_point; j> 0; j--)
        {
        NumberForm.PrintRow(i,TernaryValue[j-1]);
        };
        System.out.println();        // Throw a new line after one row completed.
       };
    } 
  } 

Java Implementation of GIANT_TERNARY Printing Using int[] to Store Conversion.