/** This class exercises a Factorial solution and a 
 * perfect number solution
 *
 * @author Nancy Harris
 * @version 10/23/2012
 */ 


public class FactorialPerfect
{
	/** Drives the two methods
	 *
	 * @param args command line arguments-unused in this application
	 */
	public static void main (String [] args)
	{
		factorials(10);
		perfectNumbers(100);
	}
	/** factorials prints the factorials from 1 to limit
	 *
	 * @param limit The number of factorials to calculate
	 */
	public static void factorials(int limit)
	{
		for (int ii = 1; ii <= limit; ii++)
		{
			System.out.println(ii + " factorial = " + factorial(ii));
		}
	}
	/** factorial calculates one factorial
	 *
	 * @param n The factorial to calculate
	 * @return The calculated factorial
	 */
	public static int factorial(int n)
	{
		int fact;
		fact = 1;
		
		for (int ii = 1; ii <= n; ii++)
		{
			fact = fact * ii;
		}
		return fact;
	}
	/** perfectNumbers prints the perfect numbers from 1 to limit
	 *
	 * @param limit The number of numbers to check
	 */
	public static void perfectNumbers(int limit)
	{
		for (int ii = 1; ii < limit; ii++)
		{
			if (isPerfect(ii))
				System.out.println(ii);
		}
	}
	/** isPerfect returns true if we have a perfect number, and false 
	 *  otherwise
	 *
	 * @param num The number to test
	 * @return True if perfect (sum of its factors is the num) or false 
	 *         if not.
	 */
	public static boolean isPerfect(int num)
	{
		int sum;
		sum = 0;
		
		for(int ii = 1; ii <= (num / 2); ii++)
		{
			if (num % ii == 0)
				sum = sum + ii;
		}
		return sum == num;
	}
}