在查找素数的程序中出乎意料地崩溃

时间:2015-02-24 17:25:27

标签: c

我想编写一个程序,可以在t个测试用例中查找两个数字之间的所有素数。但是当我运行它时,我的程序崩溃了。 拜托,有人可以帮助我吗?

我的代码:

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

void print(int a,int b)
{
    int *p,i;
    int x;
    p = (int *) malloc (sizeof(int)*(b-a));
    for(i=0;i<(b-a);i++) p[i]=a+i;
    for(i=0;i<(b-a)/2;i++)
    {
        if(p[i]!=0)
        {
            if(p[i]%i==0) p[i]=0;
        }

    }
    for(i=0;i<=(b-a);i++) if(p[i]!=0) printf("%d ",p[i]);
    free(p);
}

int main(void)
{
    int t,i,m,n;
    scanf("%d",&t);
    for(i=0;i<t;i++)
    {
        scanf("%d %d",&m,&n);
        print(m,n);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

问题是在一个范围内分配内存,分配一个元素太少(应该是malloc (sizeof(int)*(b-a+1));)然后不坚持索引分配的内存时遇到了绊脚石。这可能会简单得多:不需要数组 - 如果数字有除数,则无需检查任何其他除数。

有时,解决问题比解决问题更容易。

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

int prime(int n)
{
    int s, i;
    if (n == 1 || n == 2)
        return 1;
    if (n % 2 == 0)             // no even numbers
        return 0;
    s = (int)sqrt(n);           // limit the loop
    for (i=3; i<=s; i+=2)       // odd numbers only
        if (n % i == 0)
            return 0;
    return 1;
    }

void print(int a, int b)
{
    int n;
    for (n=a; n<=b; n++)
        if (prime (n))
            printf("%d ", n);
    printf("\n");
}

int main(void)
{
    int t, i, m, n;
    printf("Input number of ranges to test: ");
    scanf("%d", &t);
    for(i=0; i<t; i++)
    {
        printf("Input bottom and top of range: ");
        scanf("%d %d", &m, &n);
        print(m, n);
    }
    return 0;
}

答案 1 :(得分:0)

你弄乱了for循环的终止。你分配了b-a字节,但是你正在迭代b-a + 1项...

for(i=0;i<=(b-a);i++) p[i]=a+i;

需要是一个i&lt;(b-a)或者你有一个段错误(在两个循环中)。 另外正如BLUEPIX所指出的那样:

for(i=0;i<b/2;i++)

需要i&lt;(b-a)/ 2来迭代超过一半的intervall。

p[i]%i

在第一次迭代中除以零= i == 0。 在此之后,程序应该终止而没有错误。