你能帮我吗?我的C代码有什么问题? (大数的素数)
我是C初学者,我的代码不工作。
我试图确定600851475143的最大素因子,当我运行代码时,它什么都不做。但尝试使用较小的数字。
long i;
for (i = 600851475143; i > 1; i--)
{
if (600851475143 % i == 0)
{
printf("%d\n", i);
}
};
你能帮我吗?我的C代码有什么问题? (大数的素数)
我是C初学者,我的代码不工作。
我试图确定600851475143的最大素因子,当我运行代码时,它什么都不做。但尝试使用较小的数字。
long i;
for (i = 600851475143; i > 1; i--)
{
if (600851475143 % i == 0)
{
printf("%d\n", i);
}
};
首先,打印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
来代替(%lld
为printf
,LLD =长长十进制) 。
最后但并非最不重要的一点,你知道你的循环需要做600亿次迭代,不是吗?即使你有一个速度非常快的CPU系统,这也需要相当长的时间才能完成。所以你会立即看到600851475143
打印到屏幕上,但是在你的代码终止之前(或者找到另一个除数,如果这不是素数)需要相当长的时间。
可选: 而不是写600851475143
的,你可能会写600851475143LL
让编译器知道你希望这个数字是long long
类型。似乎C 2011标准不再要求这样(如果需要,数字会自动被视为long
或long long
),但我知道,对于C 2011,某些编译器最少发出数字大于int
(或更大比long
)。
谢谢,代码现在可以工作,但几乎永远都是。所以,你是对的,非常感谢。 – MartyCashew
很好的解释 –
C中的整型常量并不总是“int”。 Per C 2011 6.4.4.1 5,一个未固定的十进制常量的类型是下面列表中的第一个,它的值可以表示为:int,long int,long long int。根据第6款,如有必要,它也可以是扩展类型。 –
它可能是一个32位系统。编号600851475143
大于32位。
而不是long i
尝试:的printf("%d\n", i);
long long i;
并代之以:
printf("%lld\n", i);
代替
600851475143
并使用600851475143LL
。
感谢您的信息! – MartyCashew
您可以用小于或等于大数的平方根的最大整数开始循环。然后你可以找到通过循环工作的因子对。编写一个单独的函数来检查给定的数字是否为素数。如果这一对中较大的因子是素数,则返回它。如果较大不是素数,请检查较小者是否为素数,如果是,则返回。
什么都不做?或者仅仅花费很长的时间*来完成'for'循环?如果我正确阅读,直到循环中途才会打印第一行,对吧? –
有很多类似的问题,如堆栈溢出:https://www.google.com/#q=site:stackoverflow.com+c+prime+factor –
它不工作或只是花了很长时间完?这是一个很大的数字 – CDspace