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

标签 c

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

相关文章:

c - 如何在 C 中对另一个数组中的两个数组求和?

从 const char* 转换为 Swift 字符串

c - 哪些Windows版本不支持unicode API调用?

C 解压位掩码源

使用类函数宏编译错误

c - 递归释放C中的TRIE结构

C语言&signintHandler

c++ - 以可移植的方式将类导出到 dll,而不使用接口(interface)?

c++ - 全局数组分配——栈还是堆?

c - 为什么在函数内部调用时 malloc 返回空指针?