c - 找出两百万以下的所有质数之和。欧拉计划,C

标签 c

<分区>

所以,一切似乎都运行良好,但程序没有给我正确的答案。我的是142,915,960,832,应该是142,913,828,922。差值是 2,131,910(如果我仍然可以在纸上减去数字哈哈),我不知道我从哪里得到这两百万。谁能帮帮我?

#include <stdio.h>
#include <math.h>

#define BELOW 2000000

int isaprime (int num);

int main (void) {

    int i;
    float sum = 0;

    for (i = 2; i < BELOW; i++) {

            if (isaprime(i) == 1) {
                    sum = sum + i;
                    printf ("\n%d\t%.1f", i, sum);
            }
    }

    getch();
    return 0;
}

int isaprime (int num) {

    int i;

    for (i = 2; i <= sqrt(num); i++) {
            if (num % i == 0) {
                    return 0;
            }
            else {
                    ;
            }
    }

    return 1;
}

最佳答案

使用 float因为 sum 是问题所在。最大的整数 k 使得来自 [-k, k] 的所有整数都完全可以用 32 位 float 表示是 2^241;之后你将开始失去一些整数的精度。由于您的总和超出了该范围,以荒谬的幅度,您失去了精度并且所有赌注都关闭了。

您需要更改为更大的类型,例如 long(假设它在您的机器上是 64 位)。进行更改,您将得到正确的答案(就像我对您的代码所做的那样):

[ec2-user@ip-10-196-190-10 ~]$ cat -n euler.c
     1  #include <stdio.h>
     2  #include <math.h>
     3  
     4  #define BELOW 2000000
     5  
     6  int isaprime (int num);
     7  
     8  int main (void) {
     9  
    10      int i;
    11      long sum = 0;
    12  
    13      for (i = 2; i < BELOW; i++) {
    14  
    15              if (isaprime(i) == 1) {
    16                      sum = sum + i;
    17              }
    18      }
    19      printf("sum: %ld\n", sum);
    20  
    21      return 0;
    22  }
    23  
    24  int isaprime (int num) {
    25  
    26      int i;
    27  
    28      for (i = 2; i <= sqrt(num); i++) {
    29              if (num % i == 0) {
    30                      return 0;
    31              }
    32              else {
    33                      ;
    34              }
    35      }
    36  
    37      return 1;
    38  }
[ec2-user@ip-10-196-190-10 ~]$ gcc euler.c -lm
[ec2-user@ip-10-196-190-10 ~]$ ./a.out
sum: 142913828922

1:尾数中的 23 个显式位加上一个隐藏位。

关于c - 找出两百万以下的所有质数之和。欧拉计划,C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18157322/

相关文章:

c - 声明和定义相互引用的初始化常量结构的最佳方法

c - 我什么时候应该在 C 中使用 free()?

c - 如何检查当前索引是否是数组中的最后一个索引?

c++ - 打印浮点值时 printf 崩溃

C 函数多重定义错误但声明一次?

c - 在 txt 中使用 strstr() 找到一个字符串

c++ - 使用 C 或 C++ 以八进制形式使用 sscanf 在 char 数组中发出读取

c - 保存/复制文件指针/描述符

c - fork() 子进程和父进程

c - 我应该回收指针和引用还是创建新的?