-1

我正在尝试获取前 10 个素数,但在编译时出现浮点异常(核心转储)错误。

#include <stdio.h>
#define MAX 50

int main(void){

FILE * fp;

int i,j,cnt=0;
int prim[MAX]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};

fp = fopen("primeros.dat", "wb");

do{
    for (i=2; i<=100; i++){         
        for(j=0;j<=MAX;j++){
            if (i%prim[j]==0){
                continue;
            }
            else{
                fwrite(&i, sizeof(int), 1, fp);
                cnt++;
            }
        }
    }
}while(cnt<10);

fclose(fp);
return 0;

}

4

4 回答 4

2

问题在于使用的循环条件和隐式初始化数组元素的值。这里要提两件事

1. 多余的数组元素(当初始化列表提供的元素少于数组大小时)被初始化为 0。

引用C11,第 6.7.9 章

如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应隐式初始化与具有静态存储持续时间的对象相同。

和..

[...] 如果具有静态或线程存储持续时间的对象未显式初始化,则:

- 如果它具有算术类型,则将其初始化为(正数或无符号)零;- 如果是聚合,则根据这些规则(递归地)初始化每个成员,并将任何填充初始化为零位;[...]

2. C 数组具有从 0 开始的索引。

所以,在代码中

  for(j=0;j<=MAX;j++)

问题是双重的。

  1. 使用有效条目后,您将面临i%prim[j]. 这就是FPE的原因。

    要解决此问题,您可以在定义时省略数组大小,稍后用于sizeof获取可用作循环条件的数组大小。

  2. 如果您有MAX 有效的元素,对于您的循环,when jbecome MAX,它超出了访问范围。它调用未定义的行为

    你应该把它改成

     for(j=0; j< MAX; j++)
    

    保持在限度内。

于 2016-05-05T08:04:29.450 回答
2
for(j=0;j<=MAX;j++)

应该

for(j=0;j<MAX;j++)

您的数组的有效访问权限是prim[0]这样的prim[49]访问prim[50]是数组越界访问,它会调用未定义的行为

于 2016-05-05T08:04:42.713 回答
0

这个奇怪的程序要求发现前 10 个素数,但已经包含了前 20 个素数的数组。它还会导致除以 0 错误,因为 的j循环限制MAX将导致数组中的值的索引0(但无论如何都会超出范围j == MAX)。

这个解决方案首先要知道 only2是一个素数。它构建素数数组,使用每个素数来测试更多的素数。

输出文件是二进制格式的——我会输出到一个文本文件,但这不是主要问题,我只在这个例子中将素数写入控制台。

#include <stdio.h>

#define MAX 100

int main(void){
    int i, j, cnt = 1;
    int prim[MAX] = { 2 };

    for(i=3; i<MAX; i++) {
        for(j=0; j<cnt; j++) {
            if(i % prim[j] == 0) {
                break;
            }
        }
        if(j == cnt) {
            prim[cnt++] = i;
        }
    }

    for(j=0; j<cnt; j++) {
        printf("%4d", prim[j]);
    }
    printf("\n");
    return 0;
}

程序输出:

   2   3   5   7  11  13  17  19  23  29  31  37  41  43  47  53  59  61  67  71
  73  79  83  89  97
于 2016-05-05T08:30:45.390 回答
0

这里:

for(j=0; j<=MAX; j++){

你最多只能从 0 到 max-1 [0,max)

改为

for(j=0; j<MAX; j++){
于 2016-05-05T08:33:54.640 回答