SPOJ PRIME1:即食;有没有办法避免动态数组?
SPOJ PRIME1: RTE; Is there a method to avoid dynamic array?
我阅读了埃拉托色尼筛分算法并尝试实现它,代码编译时没有任何错误,但我得到的是空白输出。
这是代码:-
#include <stdio.h>
#include <stdlib.h>
#define limit 100000
int main()
{
int prime[limit];
int i,j,t;
int n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
for(i=0;i<=n;i++)
{
prime[i]=1;
}
prime[0]=0;
prime[1]=0;
for(i=2;i<=n;i++)
{
if(prime[i]==1)
{ for(j=2;i*j<=n;j++)
prime[i*j]=0;
}
}
for(i=m;i<=n;i++)
{
if(prime[i]!=0)
printf("%d\n",i);
}
}
return 0;
}
问题在于您的筛选阵列的大小:它必须足够大以拉伸到您希望处理的最大数量,而不是您希望找到的项目数量。
您的实现适合查找 100 以内的素数,而不适合前 100 个素数。由于素数100是541,所以需要将size改为542:
int prime[542];
您还需要在代码中区分 n
-the-number-of-primes 和 n
-the-highest-prime。我建议保留 n
作为您希望查找的素数的数量,并使用 #define SIZE 542
作为数组的大小。确保在访问数组元素时使用 < SIZE
而不是 <= SIZE
。
一件重要的事情:你不必打印 prime[i](它是 1)但是 i.
这样你会得到更有趣的输出...
我阅读了埃拉托色尼筛分算法并尝试实现它,代码编译时没有任何错误,但我得到的是空白输出。 这是代码:-
#include <stdio.h>
#include <stdlib.h>
#define limit 100000
int main()
{
int prime[limit];
int i,j,t;
int n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
for(i=0;i<=n;i++)
{
prime[i]=1;
}
prime[0]=0;
prime[1]=0;
for(i=2;i<=n;i++)
{
if(prime[i]==1)
{ for(j=2;i*j<=n;j++)
prime[i*j]=0;
}
}
for(i=m;i<=n;i++)
{
if(prime[i]!=0)
printf("%d\n",i);
}
}
return 0;
}
问题在于您的筛选阵列的大小:它必须足够大以拉伸到您希望处理的最大数量,而不是您希望找到的项目数量。
您的实现适合查找 100 以内的素数,而不适合前 100 个素数。由于素数100是541,所以需要将size改为542:
int prime[542];
您还需要在代码中区分 n
-the-number-of-primes 和 n
-the-highest-prime。我建议保留 n
作为您希望查找的素数的数量,并使用 #define SIZE 542
作为数组的大小。确保在访问数组元素时使用 < SIZE
而不是 <= SIZE
。
一件重要的事情:你不必打印 prime[i](它是 1)但是 i. 这样你会得到更有趣的输出...