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

10-09 18:22