/**
* This is a class implements a Java application that finds and prints the
* prime factors of a given number.
*
* It uses a recursive method to examine each of the different values of Y.
* The value from the recursive method is a void. It uses a loop to divide X
* by Y as many times as needed. The number X must is specified as the only
* command line argument to the program.
*
* @author Cheng Yu
* @assignment TA 2
* @date Jan 28, 2010
* @bugs None
*/
public class ChengJade2 {
/**
* The entry point of the application.
*
* @param args The command line arguments.
*/
public static void main(final String[] args) {
// If the command line has anything other than a single integer, the
// program prints an error message and exits.
if (args.length != 1) {
System.err.println("The argument is not a single input.");
System.exit(1);
}
// If the command line input is not an integer, the program prints an
// error message and exits.
int x = 0;
try {
x = Integer.parseInt(args[0]);
} catch (final NumberFormatException e) {
System.err.println("The argument is not an integer.");
System.exit(2);
}
// If the command line input is an integer smaller than 2, the program
// prints prints an error message and exits.
if(x < 2) {
System.err.println("The argument is not an integer greater than 1.");
System.exit(3);
}
// Call the recursive function and print out the prime factors.
System.out.print(x + "'s prime factors:");
ChengJade2.findPrimeFactors(x, 2);
System.out.println();
// Exit cleanly while debugging from Eclipse.
System.exit(0);
}
/**
* Finds and print out the prime factor of a specified integer x.
*
* @param x the integer to be examined.
* @param y the prime factors of the integer x.
*/
private static void findPrimeFactors(int x, final int y) {
// If y is greater than the square root of x, the next prime factor of
// x is itself. Never print a factor of "1".
if (y > Math.sqrt(x)) {
if (x != 1)
System.out.print("\t" + x);
return;
}
// If y is a prime factor, print y. Then dive x by y as many times as
// needed.
if (x % y == 0) {
System.out.print("\t" + y);
while(x % y == 0)
x = x / y;
}
// Call the function with either modified or original x. Check if the
// next y is a primer factor.
findPrimeFactors(x, y + 1);
}
}