我的C代码出了什么问题? (大数要素)

时间:2014-01-09 18:45:56

标签: c for-loop factorization

你能帮我吗?

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

我正在尝试确定最大的素数因子600851475143,当我运行代码时,它什么也没做。尝试使用较小的数字然而有效。

long i;

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

3 个答案:

答案 0 :(得分:5)

它可能是一个32位系统。数字600851475143大于32位。

而不是long i尝试:

long long i;

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

printf("%lld\n", i);

并使用600851475143LL代替600851475143

答案 1 :(得分:3)

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

下一个可能的问题是,600851475143不仅适用于32 bit变量,而且long仅保证至少为32 bit。它可能比那更大,但只保证32 bits。那么你确定long在你的系统上足够大吗?

尝试

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

如果说8,一切都很好,如果只说4long是不够的,你需要使用long long代替{{1}对于%lld,lld = long long decimal)。

最后但同样重要的是,您知道您的循环需要进行6000亿次迭代,不是吗?即使你有一个非常快的系统和一个非常快的CPU,这将需要相当长的一段时间才能完成。因此,您会立即在屏幕上看到printf,但在您的代码终止之前需要相当长的时间(或者找到另一个除数,以防这不是素数)。

任选地: 您可以编写600851475143而不是编写600851475143,让编译器知道您希望此数字为600851475143LL类型。看起来C 2011标准不再需要这个(如果需要,数字会自动被视为long longlong),但我知道C 2011的一些编译器最少发出警告数字大于long long(或大于int)。

答案 2 :(得分:0)

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