/*
AUTORE: Manuel Vichi
Descrizione di un numero
*/
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
//Function to calculate the square of a number (because why not??)
int square(int x) {
	return x * x;
}

//Boolean function to determinate if a number is automorphic
bool isAutomorphic(int num) {
    int temp = num;
    int digits = 0;
    while (temp > 0) {
        digits++;
        temp /= 10;
    }
    int lastDigits = square(num) % static_cast<int>(pow(10, digits));
    return lastDigits == num;
}

//Function to check if a number is prime
bool isPrimeNumber(int num) {
    if (num <= 1)
		return false;
    for (int i = 2; i * i <= num; i++) {
        if (num % i == 0)
			return false;
    }
    return true;
}

//Function to check if a number is perfect
bool isPerfectNumber(int n) {
    if (n <= 1)
		return false;
    int sum = 0;
    for (int i = 1; i <= n / 2; ++i)
        if (n % i == 0)
            sum += i;
    return sum == n;
}

//Function to reverse the number
int reverseNumber(int number) {
	int original = number;
    int reversed = 0;
    while (number > 0) {
        int digit = number % 10;
        reversed = reversed * 10 + digit;
        n /= 10;
    }
    return reversed;
}

//Function to check if a number is palindrome
bool isPalindrome(int n) {
    int original = n;
    int reversed = reverseNumber(n);
    return original == reversed;
}


//Main function, asks in input the number and prints if it's automorphic or not
int main() {
	int numero;
    cout << "Inserisci il numero: ";
    cin >> numero;
    cout << endl;
    cout << "Il numero " << numero << " fornito in input ha le seguenti caratteristiche:" << endl;
    if (isAutomorphic(numero))
    	cout << "Il numero e' automorfo" << endl;
    else
    	cout << "Il numero non e' automorfo" << endl;
    if (isPrimeNumber(numero))
    	cout << "Il numero e' primo" << endl;
    else
    	cout << "Il numero non e' primo" << endl;
    if (isPerfectNumber(numero))
    	cout << "Il numero e' perfetto" << endl;
    else
    	cout << "Il numero non e' perfetto" << endl;
    if (isPalindrome(numero))
    	cout << "Il numero e' palindromo" << endl;
    else
    	cout << "Il numero non e' palindromo" << endl;
    cout << endl; //Just to separate the output of the program
    cout << "Il numero " << numero << " invertito e': " << reverseNumber(numero) << endl;
    system("pause"); //Needed on Windows to display the console output if the executable is not runned from a console
    return 0;
}
