Im trying to learn alot more about C code by trying to do the examples on the Project Eular Page : http://projecteuler.net/problems
At the moment im trying to work out the highest prime factor from the number 600851475143.
Here is my code:
/* The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?*/
#include <stdio.h>
unsigned long long GetPrimeFactor(unsigned long long number)
{
/* printf("The number you typed was %d\n", number);*/
unsigned long long prime = 2;
unsigned long long LargestPrime = 0;
while (prime != 0)
{
if(number%prime == 0)
{
if(number == prime)
{
if(LargestPrime < prime)
LargestPrime = prime;
printf("End of prime factors \nLargest Prime: %d\nEnding Number: %d\n", LargestPrime, number);
break;
}
else if(LargestPrime < prime)
LargestPrime = prime;
//divide number by prime
number = number/prime;
printf("Prime: %d\n", prime);
}
else
{
//get new prime
prime = nextPrimeNumber(prime);
}
}
}
unsigned long long nextPrimeNumber(unsigned long long input)
{
unsigned long long nextPrimeNumber;
while(input !=0)
{
if( input < 0)
{
printf("The number you have entered is negative\n");
}
else if (input > 0)
{
nextPrimeNumber = input + 1;
if(nextPrimeNumber%2 == 0 && nextPrimeNumber != 2)
{
nextPrimeNumber += 1;
}
while(!isPrime(nextPrimeNumber))
{
nextPrimeNumber += 2;
}
return nextPrimeNumber;
}
}
}
int isPrime(int number)
{
int i;
int prime = 1; //true
if(number == 2)
prime = 0; //false
if(number%2 == 0 || number <= 1)
prime = 0;
else
{
for(i=3; i<sqrt(number) && prime == 1; i+=2)
if(number%i == 0)
prime = 0;
}
return prime;
}
int main(void)
{
unsigned long long number;
printf("Enter a Number: \n");
scanf("%d", &number);
GetPrimeFactor(number);
return 0;
}
This code works for the number 13195 which is in the example, but goes bad when i try the larger numbers and im not sure whats wrong.
output with large number 600851475143: prime: 3 prime: 29 prime: 5108231 etc.
this cant be correct because the number cannot be divisible by 3 anyway.
Cant work out whats going wrong so any help would be great
Signed
intsgo up to 2147483647,unsigned intsgo up to 4294967295, you could useunsigned long longwhich goes up to 18446744073709551615 and if you need something even bigger use an arbitrary-precision/bignum library like GnuMP ( http://gmplib.org/)Update to your edited question:
The format specifier for scanf you use does not even read the whole
unsigned long long, i read somewhere that you have to use%llu, however on my gcc this does not work, i have to use: