gpt4 book ai didi

c - 为什么我得到的返回值为 -1 (0xFFFFFFFF)?

转载 作者:太空宇宙 更新时间:2023-11-04 06:15:06 25 4
gpt4 key购买 nike

我最近开始学习 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com