import java.util.Scanner;
public class SimpRad4
{
public static final String SQUARE_ROOT_SYMBOL = "\u221A";
public static final int INPUT_FAILURE = -1;
static long[] simplify( long square )
{
long outside = 1;
long inside = square;
long[] simplified = { 1, square };
// Check if it's already a perfect square
outside = (long)Math.sqrt(square);
if ((outside * outside) == square)
{
simplified[0] = outside;
simplified[1] = 1;
return simplified;
}
// Find all the squares that could be factors and see if they are
for (long factor = 2, sqr = 4; sqr <= (square / 2); factor++, sqr = (factor * factor))
{
// Is this square a factor?
if ((square % sqr) == 0)
{
simplified[0] = factor;
simplified[1] = square / sqr;
}
}
// Otherwise, since it hasn't simplified, return the original radical
return simplified;
}
public static String display( long radicand, long multiplier, long newRad, boolean negative )
{
String i = negative ? "i" : "";
String negativeStr = negative ? "-" : "";
// If it's already simplified
if (multiplier == 1)
{
return (SQUARE_ROOT_SYMBOL + negativeStr + radicand + " = " + i
+ SQUARE_ROOT_SYMBOL + newRad);
}
// If it's a perfect square
else if (newRad == 1)
{
return (SQUARE_ROOT_SYMBOL + negativeStr + radicand + " = " + multiplier + i);
}
else
{
return (SQUARE_ROOT_SYMBOL + negativeStr + radicand + " = " + multiplier + i
+ SQUARE_ROOT_SYMBOL + newRad);
}
}
public static void main( String[] args )
{
Scanner user_input = new Scanner(System.in);
long radicand = INPUT_FAILURE;
long[] rads;
boolean isNegative = false;
String arg;
try {
arg = args[0];
radicand = Long.parseLong(arg);
} catch( ArrayIndexOutOfBoundsException e ) {
arg = "";
} catch( NumberFormatException e2 ) {
arg = "";
}
while (radicand < 0)
{
System.out.print("Please enter the current radicand: ");
try {
radicand = Long.parseLong(user_input.next());
} catch (NumberFormatException e) {
System.out.print("That's not an integer! ");
radicand = INPUT_FAILURE;
continue;
}
if (radicand < 0)
{
radicand = -radicand;
isNegative = true;
}
}
// Timing for optimal testing purposes
long startTime = System.nanoTime();
rads = simplify(radicand);
System.out.println(display(radicand, rads[0], rads[1], isNegative));
long endTime = System.nanoTime();
System.out.println("This took " + (endTime - startTime) + "ns.");
}
}
Comments