我正在尝试通过在Project Eular Page:http://projecteuler.net/problems上做例子来学习更多关于C代码的知识。现在我正在试着从数字600851475143中计算出最高的素因数。下面是我的代码:
/* 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;
}此代码适用于示例中的数字13195,但当我尝试更大的数字时,它会变得很糟糕,我不确定哪里出了问题。
输出大数字600851475143:质数:3质数: 29质数: 5108231等等,这是不正确的,因为这个数字无论如何都不能被3整除。
我不能找出哪里出了问题,所以任何帮助都会很好
发布于 2012-02-16 21:05:13
Signed ints上升到2147483647,unsigned ints上升到4294967295,你可以使用unsigned long long,它上升到18446744073709551615,如果你需要更大的东西,可以使用像GnuMP ( http://gmplib.org/)这样的任意精度/基准库
对您编辑的问题的更新:
如果你使用的格式说明符甚至没有读取整个unsigned long long,我在某个地方读到你必须使用%llu,但是在我的gcc上这不起作用,我不得不使用:
printf("Enter a Number: \n");
scanf("%I64d", &number);
printf("%I64d", number); // <- make sure that this prints the number you
// gave it before even calling GetPrimeFactor()发布于 2012-02-16 21:29:16
你换过scanf了吗?
scanf("%L", &number)https://stackoverflow.com/questions/9311714
复制相似问题