Original Post
Hello, I am working on some problems on Project Euler and in one problem it asks you to Write a program which computes biggest prime factor of number. I have written program in C, what finds all primes up to entered number, divides that number by primes and shows biggest prime factor. It is working just fine, bet when I entered bigger numbers like million and so on(and number in Project Euler problem is really big) it crashes. I think it might have issues with perfomance of program and my algorithm efficiency. This is my code:
[source lang="cpp"]//Searches for number prime factors and return biggest prime factor 2012-10-23(24)
#include
#include
int isPrime(int num); // checks if number is prime: 1 - prime 0 - non-prime
void setPrimeArray(int * arr, int num); // composes array of primes up to num to test factors
int * primeFactors(int * arr, int num);//finds prime factors of number
int biggestPrimeFactor(int * factors,int size);//finds biggest prime factor
int setArray (int * arr); // deletes 0 from array and returns setted array(using dynamic reallocation)
int main()
{
int num = 0;
int * numFactors = 0;
int numOfFac = 0;
int i = 0;
printf("Enter the number whose prime factors you want to find: \n");
scanf("%i", #);
int * primeArray = calloc(num,sizeof(int));
setPrimeArray(primeArray,num);//optimize this function
int s = setArray(primeArray);
printf("Prime numbers up to %i:\n",num);
for(;i < s; i++)printf("%i ",primeArray);
i = 0;
// primeArray -=3;
numFactors = primeFactors(primeArray, num);
numOfFac = setArray(numFactors);
printf("\nPrime Factors of %i is:\n",num);
for(;i < numOfFac; i++)printf("%i ",numFactors);
printf("\nThe biggest prime factor of %i is: %i\n",num, biggestPrimeFactor(numFactors,numOfFac));
system("PAUSE");
free(primeArray);
free(numFactors);
return 0;
}
int isPrime(int num)
{
int factor = 0;
if (num == 1) return 1;
int i = 1;
for (; i <= num; i ++)
{
if( num % i == 0) factor++;
}
if (factor <= 2) return 1;
else return 0;
}
void setPrimeArray(int * arr, int num)
{
int i = 1;
int j = 0;
for(; i <= num; i++)
{
if(isPrime(i))
{
arr[j] = i;
j++;
}
}
}
int * primeFactors(int * arr, int num)
{
int i = 1;//not 0 - do not include prime factor 1, starts from 2
int j = 0;//for indexing primeFactors array;
int * factors = calloc(num, sizeof(int));//HERE WAS ERROR - MUST USE DYNAMIC MEMORY WITH FACTORS
for(;i < num;)
{
if (num % arr == 0) //
{
factors[j] = arr; //BIG, BIG
//*factors = arr; //
//factors++; //
j++; // MISTAKE...
num /= arr; //
i = 1; //
}
else i++;
if (num == 1) return factors;
}
return factors;
}
int biggestPrimeFactor(int * factors,int size)
{
int i = 0;
int max = factors[0];
for(;i < size; i ++)
{
if (factors > max) max = factors;
}
return max;
}
int setArray (int * arr)
{
int i = 0;
while(*arr != 0)
{
arr++;
i++;
}
arr = realloc(arr, sizeof(int)*i);
return i;
}
[/source]
And I think I need optimize this function:
[source lang="cpp"]void setPrimeArray(int * arr, int num)
{
int i = 1;
int j = 0;
for(; i <= num; i++)
{
if(isPrime(i))
{
arr[j] = i;
j++;
}
}
}[/source]
Because it takes a lot of time with bigger numbers in this function. It makes an array of primes up to numbers, so I can later use it to find prime factors of number. So if anyone have ideas how I can optimize my code, please share them with me.
[source lang="cpp"]//Searches for number prime factors and return biggest prime factor 2012-10-23(24)
#include
#include
int isPrime(int num); // checks if number is prime: 1 - prime 0 - non-prime
void setPrimeArray(int * arr, int num); // composes array of primes up to num to test factors
int * primeFactors(int * arr, int num);//finds prime factors of number
int biggestPrimeFactor(int * factors,int size);//finds biggest prime factor
int setArray (int * arr); // deletes 0 from array and returns setted array(using dynamic reallocation)
int main()
{
int num = 0;
int * numFactors = 0;
int numOfFac = 0;
int i = 0;
printf("Enter the number whose prime factors you want to find: \n");
scanf("%i", #);
int * primeArray = calloc(num,sizeof(int));
setPrimeArray(primeArray,num);//optimize this function
int s = setArray(primeArray);
printf("Prime numbers up to %i:\n",num);
for(;i < s; i++)printf("%i ",primeArray);
i = 0;
// primeArray -=3;
numFactors = primeFactors(primeArray, num);
numOfFac = setArray(numFactors);
printf("\nPrime Factors of %i is:\n",num);
for(;i < numOfFac; i++)printf("%i ",numFactors);
printf("\nThe biggest prime factor of %i is: %i\n",num, biggestPrimeFactor(numFactors,numOfFac));
system("PAUSE");
free(primeArray);
free(numFactors);
return 0;
}
int isPrime(int num)
{
int factor = 0;
if (num == 1) return 1;
int i = 1;
for (; i <= num; i ++)
{
if( num % i == 0) factor++;
}
if (factor <= 2) return 1;
else return 0;
}
void setPrimeArray(int * arr, int num)
{
int i = 1;
int j = 0;
for(; i <= num; i++)
{
if(isPrime(i))
{
arr[j] = i;
j++;
}
}
}
int * primeFactors(int * arr, int num)
{
int i = 1;//not 0 - do not include prime factor 1, starts from 2
int j = 0;//for indexing primeFactors array;
int * factors = calloc(num, sizeof(int));//HERE WAS ERROR - MUST USE DYNAMIC MEMORY WITH FACTORS
for(;i < num;)
{
if (num % arr == 0) //
{
factors[j] = arr; //BIG, BIG
//*factors = arr; //
//factors++; //
j++; // MISTAKE...
num /= arr; //
i = 1; //
}
else i++;
if (num == 1) return factors;
}
return factors;
}
int biggestPrimeFactor(int * factors,int size)
{
int i = 0;
int max = factors[0];
for(;i < size; i ++)
{
if (factors > max) max = factors;
}
return max;
}
int setArray (int * arr)
{
int i = 0;
while(*arr != 0)
{
arr++;
i++;
}
arr = realloc(arr, sizeof(int)*i);
return i;
}
[/source]
And I think I need optimize this function:
[source lang="cpp"]void setPrimeArray(int * arr, int num)
{
int i = 1;
int j = 0;
for(; i <= num; i++)
{
if(isPrime(i))
{
arr[j] = i;
j++;
}
}
}[/source]
Because it takes a lot of time with bigger numbers in this function. It makes an array of primes up to numbers, so I can later use it to find prime factors of number. So if anyone have ideas how I can optimize my code, please share them with me.