用筛法求之N内的素数,这样有错吗?测试数据都过了但就是答案不正确,求大牛

dsdfsdfsdf 2012-01-02 06:07:38
N(0<=N<=10,000,000)

Output
0~N的素数

Sample Input
100

Sample Output
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
#include<stdio.h>
#define N 5000000
int array[N],prime[N];
int main()
{
int i, j, k, n;
k = 0;

for (i = 2; i < 10000000; i++)
{
if (array[i] == 0)
{
prime[k++] = i;
for(j = 2; i*j < 10000000; j++)
{
array[i*j] = 1;
}
}
}

while (scanf("%d",&n) != EOF)
{
for (i = 0; prime[i] < n; i++)
{
if (prime[i] != 0)
printf("%d\n",prime[i]);
}
}

return 0 ;
}











...全文
221 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gloveing 2012-01-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yukidson 的回复:]
我的思路是把素数的倍数全部筛去。从2开始一直把他所有倍数全筛去,这样可以吗?
[/Quote]
所有的整数都可以表示成素数的乘积,所以一个合数肯定是某个素数的倍数
dsdfsdfsdf 2012-01-02
  • 打赏
  • 举报
回复
#include<stdio.h>
#define N 500000
int Not_prime[N],prime[N];
int main()
{
int i, j, k, n;
k = 0;

for (i = 2; i < 10000000; i++)
{
if (Not_prime[i] == 0)
{
prime[k++] = i;
for(j = 2; i*j < 10000000; j++)
{
Not_prime[i*j] = 1;
}
}
}

while (scanf("%d",&n) != EOF)
{
for (i = 0; prime[i] < n; i++)
{
if (prime[i] != 0)
printf("%d\n",prime[i]);
}
}

return 0 ;
}

看看这个我的思路





dsdfsdfsdf 2012-01-02
  • 打赏
  • 举报
回复
我的思路是把素数的倍数全部筛去。从2开始一直把他所有倍数全筛去,这样可以吗?
dingdali89 2012-01-02
  • 打赏
  • 举报
回复
没看懂 我编过这个,不过和楼主的方法不一样,我的能用
尘缘udbwcso 2012-01-02
  • 打赏
  • 举报
回复
#define N 5000000
int array[N],prime[N];

有必要这样吗?
ACM的话对时间和空间都是有要求的吧

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧