
//  This program calculates the greatest common factor for two integers.


#include <math.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>


void factors(void);


#define MAX 10000000

unsigned long i,inum,inum1,inum2,istore,j,k;
unsigned long num[100],num1[100],num2[100];

double error;

int iflag = 0;

FILE *pFile[1];
char filename[1][15];

void main()
{

	printf("\n\n gcf.cpp  version 1.1 \n");
	printf("\n By Tom Irvine   Email:  tomirvine@aol.com \n");

	printf("\n\n This program calculates the greatest common factor for two integers. \n");


	printf("\n Enter the first integer \n");
    scanf("%ld",&inum1);

	if(double(inum1) > 2.0e+08)
	{
		printf("\n Error: input value is too high.\n");
		exit(1);
	}

	
	printf("\n Enter the second integer \n");
    scanf("%ld",&inum2);

	if(double(inum2) > 2.0e+08)
	{
		printf("\n Error: input value is too high.\n");
		exit(1);
	}


	for(i=0; i<100; i++)
	{
		num1[i]=0;
		num2[i]=0;
	}



	istore=inum1;

	factors();
	for(i=0; i<100; i++)
	{
		num1[i]=num[i];
	}


	istore=inum2;

	factors();
	for(i=0; i<100; i++)
	{
		num2[i]=num[i];
	}

	long gcf=1;

	for(i=0; i<100; i++)
	{
		for(j=0; j<100; j++)
		{
			if(num1[i] != 0 && num2[j] != 0 )
			{
				if(num1[i] == num2[j] )
				{
					gcf*=num1[i];
					num2[j]=0;
				}

				break;
			}
		}
	}

	printf("\n\n Greatest Common Factor = %ld ",gcf);

	printf("\n\n Calculation complete. \n\n Press any key to exit. \n\n");
	getch();
}

void factors(void)
{
	inum = istore;

	for(i=0; i<100; i++)
	{
		num[i]=0;
	}

    
	k=0;

	while(1)
	{
		for(i=2; i<= inum/2; i++)
		{
			error= (double(inum)/double(i))-double(unsigned long(double(inum)/double(i)));

			if(fabs(error) < 1.0e-12)
			{
        
				iflag=1;

				num[k]=i;
				k++;

				inum=unsigned long(double(inum)/double(i));


				break;
			}
		}
	    if(num[0]==istore){iflag=0;}

		if(iflag==0 || inum <2)
		{
			break;
		}
		if( i > inum/2 && iflag ==1 )
		{
			num[k]=inum;
			k++;

			break;
		}
	}




    if(iflag==0)
	{
		printf("\n\n %ld is a prime number. \n",istore);
	}
	else
	{
		printf("\n\n factors of %ld\n",istore);

		for(i=0; i<k; i++)
		{
			printf(" %ld \n",num[i]);
		}
	}

}
