C程序找到第n个素数 -

时间:2014-09-16 11:07:43

标签: c arrays malloc unsigned-long-long-int

#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)正在提供核心转储错误,因此存在一些与全局动态数组相关的故障。 问:这是声明全局动态数组的正确方法吗?这段代码中可能出现什么问题? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

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

  • 2行注释范围为您的代码行
  • 第二个是否应检查count < n而不是count <= 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,因为它看起来像是你的界限。

答案 1 :(得分:2)

你的计数器超出了数组的大小。特别是对于i = 2,满足两个条件(6i-1和6i + 1),因此计数器递增两次,导致使用arr [5],其中你只在数组中分配了5个位置。这是因为您检查计数器&lt; = n而不是计数器

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