#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
	TYPEDEFS & ENUMS
*/

typedef unsigned int bool;

enum boolstate
{
	true = 1,
	false = 0
};


/*
	MY MATH FUNCTIONS
*/

bool isPrime(long int num)
{
	bool r = true;
	int i;

	for (i = 2; i < num; i++)
	{
		if ((num % i) == 0) r = false;
	}

	return r;
}

bool isDivisor(const long int div, const long int num)
{
	if ((num % div) == 0) return true; else return false;
}


/*
	MAIN
*/

int main(void)
{
	long int n;
	long int i;
	long int d;
	
	int j;
	int tmp;
	
	long int r[24][2];
	long int rn;
	
	printf("\n Number Scomposer\nwritten in C by Gi@cky98\n\nUsage: write number to scompose. Write 0 to exit.\n\n");

    begin:	
	printf("Number to scompose: ");
	scanf("%i", &tmp);
	n = (long int)tmp;
	
	if (!n) return 0;
	
	for (i = 0; i < 24; i++)
	{
		r[i][0] = 0;
		r[i][1] = 0;
	}
	
	rn = 0;
	while (n != 1)
	{
		for (i = 2; i <= n; i++)
		{
			if ((isPrime(i) == true) && (isDivisor(i, n) == true))
			{
				tmp = 0;
				n = n / i;
				for (j = 0; j < rn; j++)
				{
					if (r[j][0] == i) { r[j][1]++; tmp = 1; break;}
				}
				if (!tmp) { r[rn][0] = i; r[rn][1]++; rn++; }
			}
		}
	}

	printf("Result: %i^%i", (int)r[0][0], (int)r[0][1]);
	for (j = 1; j < rn; j++)
	{
		printf(" * %i^%i", (int)r[j][0], (int)r[j][1]);
	}
	printf("\n\n");
	
	goto begin;
	
	return 0;
}
