//  Data Structures with Java by John R. Hubbard
//  Copyright McGraw-Hill, 2001
//  Problem 1.7 on page 21


public class Pr0107
{ public static void main(String[] args)
  { int n=1;
    while (n>0)
    { System.out.println("signedToBinary(" + n + ") = " + signedToBinary(n));
      System.out.println("signedToBinary(" + -n + ") = " + signedToBinary(-n));
      n *= 3;
    }
    System.out.println("signedToBinary(1289) = " + signedToBinary(1289));
    System.out.println("signedToBinary(-1289) = " + signedToBinary(-1289));
  }
  
  public static String signedToBinary(int n)
  { if (n==0) return "0";
    if (n>0) return "0" + unsignedToBinary(n); // Problem 1.8
    int mod=1;
    while(mod+2*n<0)
      mod *= 2;
    return unsignedToBinary(mod+n);
  }
  
  public static String unsignedToBinary(int n)
  { // PRECONDITION: n > 0
    String code="";
    while (n > 0)
    { code = "" + (n%2) + code;  // append next bit to left of code
      n /= 2;  // remove current least significan bit
    }
    return code ;
  }
}
