
public class NumberPersonalities4 {

    public static void main(String[] args) {
        int limit = 100;
        int number = 0;
        
        while (number < 100) {
            number = number + 1;
            tellAboutNumber(number);
        }
        System.out.println();
        tellAboutNumber(12345);
        tellAboutNumber(1024);
        tellAboutNumber(1028);
        tellAboutNumber(320);
    }

    private static void tellAboutNumber(int number) {
        System.out.print(number + "    ");
        tellIf(prime(number), "prime, ", "composite, ");
        tellIf(happy(number), "happy, ", "unhappy, ");
        tellIf(triangular(number), "triangular, ", "not triangular, ");
        tellIf(square(number), "square, ", "not square, ");
        tellIf(smug(number), "smug, ", "not smug, ");
        tellIf(honest(number), "honest", "dishonest");
        System.out.println();
    }
    
    private static  void tellIf(boolean test, String yes, String no) {
        if (test) System.out.print(yes);
        else System.out.print(no);
    }

    private static boolean prime(int number) {
        int divisor = 2;
        if (number == 1) return false;
        while (divisor < number) {
            if (number % divisor == 0) return false;
            divisor = divisor + 1;
        }
        return true;
    }

    private static boolean happy(int number) {
        int sum;
        while (true) {
            sum = 0;
            while (number > 0) {
                int digit = number % 10;
                number = number / 10;
                sum = sum + digit * digit;
            }
            if (sum == 1) return true;
            if (sum == 4) return false;
            number = sum;
        }
    }

    private static boolean triangular(int number) {
        int subtract = 1;
        while (number > 0) {
            number = number - subtract;
            subtract = subtract + 1;
        }
        return number == 0;
    }

    private static boolean square(int number) {
        int subtract = 1;
        while (number > 0) {
            number = number - subtract;
            subtract = subtract + 2;
        }
        return number == 0;
    }

    private static boolean smug(int number) {
        int n = 1;
        int square = n * n;
        while (number > square) {
            if (square(number - square)) return true;
            n = n + 1;
            square = n * n;
        }
        return false;
    }

    private static boolean honest(int number) {
        int divisor = 2;
        while (divisor < number) {
            int quotient = number / divisor;
            if ((number / divisor == divisor) &&
                    quotient * quotient != number) {
                return false;
            }
            divisor = divisor + 1;
        }
        return true;
    }
}
