0
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int prime(long long int);
long long int *arr;         //array to hold n prime numbers
int main()
{
    int i,count=4;;
    long long int n;
    scanf("%lli",&n);
    arr=malloc(sizeof(long long int)*n);
    arr[0]=2;
    arr[1]=3;
    arr[2]=5;
    arr[3]=7;
    if (n==1) printf("%lli",arr[0]);
    else{ if (n==2) printf("%lli",arr[1]);
    else{ if (n==3) printf("%lli",arr[2]);
    else{ if (n==4) printf("%lli",arr[3]);
    else
    {
        for(i=2;count<n;i++)
        {
            if(prime(6*i-1)) {             /*As prime nos are always 6k+1 or 
            arr[count]=6*i-1;               6k-1fork>=2 I checked only for those*/
            count++; }
            if(prime(6*i+1)&&count<=n) {
            arr[count]=6*i+1;
            count++; }
            }
    printf("%lli",arr[count]);
    }}}}
    //free(arr);
return 0;
}

int prime(long long int x)
{
    int j=1,flag=1;
    while(arr[j]<=sqrt(x))
    {
        if (x%arr[j]==0)
        {
            flag=0;
            break;
        }
        j++;
    }
    return flag;
}
  1. 该代码仅适用于 n=1,2,3,4,即 i=0,1,2,3,其值已明确给出。对于 n=5 起,它给出 0 作为 O/P
  2. 与全局动态数组相关的一些故障free(arr)是核心转储错误。问:这是声明全局动态数组的正确方法吗?这段代码可能有什么问题?先感谢您。
4

2 回答 2

3

如果那是您的实际代码,那么您有 4 个错误:

  • 2 行注释限定了一行代码
  • 第二个 if 不应该检查count < ncount <= n好像count == n你不能写arr[count]
  • 你不能arr[count]只打印arr[count-1]这可能就是你的意思
  • 在 n 小于 4 的情况下,您仍然设置arr[1]arr[2]并且arr[3]可能超出范围

在每个循环迭代中调用当然也是低效的sqrt(x),可能你应该在外面调用它,并且由于计算平方根的方式可能存在潜在的舍入问题,所以你可能更喜欢:

while( arr[j] * arr[j] < x )

最好不要将其设为全局并将其传递给您的函数。

最好将程序的主循环逻辑移到main().

我很惊讶您说您的程序适用于 n=1、2 和 3,因为看起来您超出了界限。

于 2014-09-16T11:19:08.963 回答
2

您的计数器超出了数组的大小。具体来说,对于 i=2,这两个条件(6i-1 和 6i+1)都满足,因此 counter 增加了两次,导致使用 arr[5] 在数组中只分配了 5 个位置。这是因为您检查 counter<=n 而不是 counter

不确定这也可能是免费创建核心转储的原因,但有可能(因为一旦损坏内存,免费可能会访问损坏的数据)。

于 2014-09-16T11:39:52.310 回答