马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这是我写的代码,M是10000就正常运行,为什么M是100000就不行。#include <stdio.h>
#define M 100000
bool mark[M];
void init()
{
for(int i = 1; i < M;i++)
{
mark[i] = false;//初始化均未标记
}
for (int i = 2; i < M; i++)
{
if(mark[i] == true)
{//如果是非素数
continue;
}
for(int j = i * i; j < M; j = j + i)
{
mark[j] = true;//将素数的倍数标记为非素数
}
}
}
int main()
{//求第k个素数
init();
int n;
while(scanf("%d",&n) != EOF)
{
for (int i = 2; i < M; i++)
{
if(mark[i] == false)
{//该数为素数
n--;
if(!n)
{
printf("%d\n",i);
}
}
}
}
return 0;
}
但是我看人家写的代码,数组也是开到一百万了都能正常运行,这是别人写的代码。#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
#define M 1000010
bool flag[M];
int prime[M];
void getprime()
{
int cnt=1;
for(int i=2;i<M;++i)
{
if(!flag[i])
{
prime[cnt++]=i;
for(int j=i;j<M;j+=i)
flag[j]=true;
}
}
}
int main(int argc, char *argv[])
{
int k;
// freopen("1040.in","r",stdin);
getprime();
prime[0]=0;
while(scanf("%d",&k)!=EOF)
{
printf("%d\n",prime[k]);
}
return 0;
}
|