我想编写一个程序,可以在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;
}
答案 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。 在此之后,程序应该终止而没有错误。