使用函数调用从键盘输入一个整数n,并输出1-n所有素数!

 我来答
8826055
推荐于2016-01-24 · TA获得超过7510个赞
知道大有可为答主
回答量:1680
采纳率:81%
帮助的人:897万
展开全部

一个直观的算法是检验2~n中每个数是不是素数,但检验一个数m是不是素数需要验证2~√m是不是2的因子,时间复杂度是O(√m),因此这种算法的时间复杂度是O(√2+√3+...+√n)=O(n√n)。


另一个算法是从2~n中依次删除2,3,……的倍数(如果这个数已经被删除,就不用考虑了。比如4在删除2的倍数时被删除了,因此删除3的倍数后不考虑4,直接删除5的倍数),那么剩下的就是素数。删除m的倍数的时间复杂度是O(n/m),因此这种算法的时间复杂度是O(n(1+1/2+...+1/n))=O(nlog n),当n非常大时会比上面的算法快。

以下是这种算法的C++程序实现:

#include <deque>
#include <iostream>
using namespace std;
void output_prime(unsigned n)
{
deque<bool> is_prime(n + 1, true);
//删除所有大于2的偶数
for (unsigned i = 4; i <= n; i += 2) is_prime[i] = false;
for (unsigned i = 3; i <= n / 2; i += 2) {
if (is_prime[i]) {//只有i之前没被删除才删除i的倍数
for (unsigned j = i * 2; j <= n; j += i) 
is_prime[j] = false;
}
}
for (unsigned i = 2; i <= n; ++i) 
if (is_prime[i]) cout << i << endl;
}
int main() {
unsigned n;
cin >> n;
output_prime(n);
return 0;
}
lgloveslg
推荐于2016-01-30
知道答主
回答量:18
采纳率:0%
帮助的人:16.2万
展开全部
#include <stdio.h>
#include <string.h>
#include <math.h>

#define MAX 50000

int num[MAX];

void init()
{
int i,j;

memset(num,0,sizeof(num));
for(i=2; i<MAX; i++)
for(j=2; j*i<MAX; j++)
if( num[i] == 0 )
num[j*i] = 1;
}

int Analy(int n)
{int i;
for (i=2; i<=n; i++)
if(!num[i]) printf("%d\n", i);
}
int main()
{
init();
int n;
scanf("%d",&n);
Analy(n);
return 0;
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式