我最近开始学习c,我的第一门编码语言。我试图从欧拉计划中解决问题3,我写这篇文章就是为了解决这个问题。此代码用于确定600851475143的最大素因数,
但是我得到了一个奇怪的返回值,我不明白。有人知道为什么吗?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 1, a = 0, prime = 0;
for(i = 1; i < 600851475143; i += 2) {
for(a = 0; a <= i / 2; a++) {
if(i % a == 0) {
break;
}
if(a = i / 2) {
if(600851475143 % i == 0) {
prime = i;
}
}
}
}
printf("%d\n", prime );
return 0;
}
最佳答案
除以0(或尝试%0
)。这是未定义的行为(UB),可以解释-1的返回。有了UB-任何事情都有可能发生。
其他代码在修复之前并不重要。
for(a = 0; a <= i / 2; a++) {
// v---- a is zero!
if(i % a == 0) {
代码应该以2开头。
// for(a = 0; a <= i / 2; a++) {
for(a = 2; a <= i / 2; a++) {
不是以
i / 2
结束,而是以√600851475143结束,这要快得多。 v-------------------v Same a <= sqrt(600851475143) without FP or overflow
for(a = 2; a <= 600851475143 / a; a++) {
其他问题也存在。
if(a = i / 2)
参见@Tom Karzesint
的范围很可能在600851475143以内,因此i < 600851475143
总是正确的。常见的编译器警告将发出此消息。请确保完全启用警告以节省时间。@iBugwarning: comparison is always true due to limited range of data type [-Wtype-limits]
伪码解
int main(void) {
wide_enough_type n = 600851475143;
wide_enough_type factor = 1;
try each i starting at 2 and until i*i <= n
repeat as long as n divides into i with no remainder
make n smaller by diving it by i
save i as factor
save the larger of (n, factor) as factor
printf("Greatest factor: %some_type_specifier\n", factor);
}
关于c - 为什么我得到的返回值为-1(0xFFFFFFFF)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47585508/