你能帮我吗?
我是C的初学者,我的代码不起作用。
我正在尝试确定最大的素数因子600851475143,当我运行代码时,它什么也没做。尝试使用较小的数字然而有效。
long i;
for (i = 600851475143; i > 1; i--)
{
if (600851475143 % i == 0)
{
printf("%d\n", i);
}
};
答案 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 =长十进制)。如果long
和int
在您的系统上有不同的尺寸(这并不罕见),那么结果将无法正确打印。
下一个可能的问题是,600851475143
不仅适用于32 bit
变量,而且long
仅保证至少为32 bit
。它可能比那更大,但只保证32 bits
。那么你确定long
在你的系统上足够大吗?
尝试
printf("%zu\n", sizeof(long));
如果说8
,一切都很好,如果只说4
,long
是不够的,你需要使用long long
代替{{1}对于%lld
,lld = long long decimal)。
最后但同样重要的是,您知道您的循环需要进行6000亿次迭代,不是吗?即使你有一个非常快的系统和一个非常快的CPU,这将需要相当长的一段时间才能完成。因此,您会立即在屏幕上看到printf
,但在您的代码终止之前需要相当长的时间(或者找到另一个除数,以防这不是素数)。
任选地:
您可以编写600851475143
而不是编写600851475143
,让编译器知道您希望此数字为600851475143LL
类型。看起来C 2011标准不再需要这个(如果需要,数字会自动被视为long long
或long
),但我知道C 2011的一些编译器最少发出警告数字大于long long
(或大于int
)。
答案 2 :(得分:0)
您可以使用小于或等于大数字平方根的最大整数来开始循环。然后你可以找到在循环中工作的因子对。写一个单独的函数来检查给定的数字是否为素数。如果该对的较大因子是素数,则返回它。如果较大的不是素数,检查较小的是否是素数,如果是,则返回它。