我最近开始学习 c,这是我的第一门编码语言。我正在尝试解决 Project Euler 中的问题 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 Karzes
int
可能的范围在 600851475143 之内,所以 i < 600851475143
总是正确的。一个常见的编译器警告会发出这个。请务必完全启用警告以节省时间。 @iBug
warning: 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/