2014-01-09 22 views
1

你能帮我吗?我的C代码有什么问题? (大数的素数)

我是C初学者,我的代码不工作。

我试图确定600851475143的最大素因子,当我运行代码时,它什么都不做。但尝试使用较小的数字。

long i; 

for (i = 600851475143; i > 1; i--) 
{ 
    if (600851475143 % i == 0) 
    { 
     printf("%d\n", i); 
    } 
}; 
+7

什么都不做?或者仅仅花费很长的时间*来完成'for'循环?如果我正确阅读,直到循环中途才会打印第一行,对吧? –

+0

有很多类似的问题,如堆栈溢出:https://www.google.com/#q=site:stackoverflow.com+c+prime+factor –

+0

它不工作或只是花了很长时间完?这是一个很大的数字 – CDspace

回答

3

首先,打印long的正确方法不是%d而是%ld(d =十进制,ld =长整数十进制)。如果longint在您的系统上具有不同的大小(这并不罕见),则结果将无法正确打印。

下一个可能的问题是60085147514332 bit变量更适合,但long只能保证至少为32 bit。它可能比这更大,但只有32 bits有保证。那么你确定long在你的系统上足够大吗?

尝试

printf("%zu\n", sizeof(long)); 

如果说8,一切都很好,如果说,只有4long是不够的,你需要使用long long来代替(%lldprintf,LLD =长长十进制) 。

最后但并非最不重要的一点,你知道你的循环需要做600亿次迭代,不是吗?即使你有一个速度非常快的CPU系统,这也需要相当长的时间才能完成。所以你会立即看到600851475143打印到屏幕上,但是在你的代码终止之前(或者找到另一个除数,如果这不是素数)需要相当长的时间。

可选: 而不是写600851475143的,你可能会写600851475143LL让编译器知道你希望这个数字是long long类型。似乎C 2011标准不再要求这样(如果需要,数字会自动被视为longlong long),但我知道,对于C 2011,某些编译器最少发出数字大于int(或更大比long)。

+0

谢谢,代码现在可以工作,但几乎永远都是。所以,你是对的,非常感谢。 – MartyCashew

+0

很好的解释 –

+1

C中的整型常量并不总是“int”。 Per C 2011 6.4.4.1 5,一个未固定的十进制常量的类型是下面列表中的第一个,它的值可以表示为:int,long int,long long int。根据第6款,如有必要,它也可以是扩展类型。 –

5

它可能是一个32位系统。编号600851475143大于32位。

而不是long i尝试:的printf("%d\n", i);

long long i; 

并代之以:

printf("%lld\n", i); 
代替 600851475143

并使用600851475143LL

+0

感谢您的信息! – MartyCashew

0

您可以用小于或等于大数的平方根的最大整数开始循环。然后你可以找到通过循环工作的因子对。编写一个单独的函数来检查给定的数字是否为素数。如果这一对中较大的因子是素数,则返回它。如果较大不是素数,请检查较小者是否为素数,如果是,则返回。