查找素数时出现运行时错误
Runtime error in finding prime numbers
Spoj 问题-
http://www.spoj.com/problems/PRIME1/
代码中存在逻辑错误,未运行。
IDE-Codeblocks
int main()
{
int t,*prime;
long long int m,n,i,j;
//t for number of test cases
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%llu%llu",&m,&n);
prime=(int*)(malloc((n-m)*sizeof(int)));
//Initialising all elements as 1
for(i=0;i<m;i++)
{
prime[i]=1;
}
prime[0]=0;
prime[1]=0;
//Initialising all the multiples of primes as 0 as in sieve algorithm
for(i=m;i<n;i++)
{
if(prime[i]!=0){
for(j=2;j*i<=1000000000;j++)
{
prime[j*i]=0;
}
}
}
for(i=m;i<n;i++)
{
printf("%llu\n",i);
}
free(prime);
}
return 0;
}
scanf("%lld %lld",&m,&n);
prime=(int*)(malloc((n-m)*sizeof(int)))
您正在为 n-m
个元素分配内存,并且您正在尝试访问第 m
个到第 n-1
个超出限制访问的元素,这将导致未定义的行为因此你看到崩溃了。
在同一个循环中有类似的其他访问,所以你应该注意这个。
例如:
输入是 5 和 10,即 m=5
和 n=10
(格式说明符应该是 %lld
for long long)
现在分配的内存是 5 个元素 prime[0]
到 prime[4]
.
在 for 循环中,您可以访问 i<n
在这种情况下,您将可以访问
prime[9]
这将导致崩溃,因为您正在访问一些不是您分配的内存
其他访问权限
prime[j*i]
如果 i=3 且 j=4 怎么办
您正在访问 prime[12]
Spoj 问题-
http://www.spoj.com/problems/PRIME1/
代码中存在逻辑错误,未运行。
IDE-Codeblocks
int main()
{
int t,*prime;
long long int m,n,i,j;
//t for number of test cases
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%llu%llu",&m,&n);
prime=(int*)(malloc((n-m)*sizeof(int)));
//Initialising all elements as 1
for(i=0;i<m;i++)
{
prime[i]=1;
}
prime[0]=0;
prime[1]=0;
//Initialising all the multiples of primes as 0 as in sieve algorithm
for(i=m;i<n;i++)
{
if(prime[i]!=0){
for(j=2;j*i<=1000000000;j++)
{
prime[j*i]=0;
}
}
}
for(i=m;i<n;i++)
{
printf("%llu\n",i);
}
free(prime);
}
return 0;
}
scanf("%lld %lld",&m,&n);
prime=(int*)(malloc((n-m)*sizeof(int)))
您正在为 n-m
个元素分配内存,并且您正在尝试访问第 m
个到第 n-1
个超出限制访问的元素,这将导致未定义的行为因此你看到崩溃了。
在同一个循环中有类似的其他访问,所以你应该注意这个。
例如:
输入是 5 和 10,即 m=5
和 n=10
(格式说明符应该是 %lld
for long long)
现在分配的内存是 5 个元素 prime[0]
到 prime[4]
.
在 for 循环中,您可以访问 i<n
在这种情况下,您将可以访问
prime[9]
这将导致崩溃,因为您正在访问一些不是您分配的内存
其他访问权限
prime[j*i]
如果 i=3 且 j=4 怎么办
您正在访问 prime[12]