您的位置:首页 > 其它

POJ 1595 Prime Cuts (ZOJ 1312) 素数打表

2014-02-07 23:34 387 查看
ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=312

POJ: http://poj.org/problem?id=1595
题目大意:

给你两个数n和c,如果1~n(包括1和n)之间的素数个数为偶数个,则输出中间c*2个素数否则输出中间c*2-1个素数。

思路:

呀呀呀,玩了一天了,A道水题洗洗睡吧。

直接筛选素数打表。

注意c比1~n的个数大的情况要把1~n中所以素数输出。

OK,然后这题1也算素数。。

#include<cstdio>
const int MAXN=1024;
bool isprime[MAXN]={0};
int cnt[MAXN]={0};
int prime[MAXN],len;
int main()
{
for(int i=2;i*i<MAXN;i++)
{
if(!isprime[i])
for(int j=i;j*i<MAXN;j++)
isprime[i*j]=true;
}
len=0;
for(int i=1;i<MAXN;i++)
{
cnt[i]+=cnt[i-1];
if(isprime[i]) continue;
cnt[i]++;
prime[len++]=i;
}
int n,c;
while(~scanf("%d %d",&n,&c))
{
//	printf("%d\n",cnt
);
printf("%d %d:",n,c);
if(c*2>	cnt
)            //WA在这,题目说的如果超过个数那就输出1~n
{
for(int i=0;i<cnt
;i++)
printf(" %d",prime[i]);
}
else if(cnt
& 1) //odd   c*2-1     cnt
=a+c*2-1+a -> a=(cnt
+1)/2-c
{
int a=(cnt
+1)/2-c;
int len=2*c-1;
for(int i=0;i<len;i++)
printf(" %d",prime[a++]);
}
else   //even  c*2    cnt
=a+c*2+a -> a=(cnt
)/2-c
{
int a=(cnt
)/2-c;
int len=2*c;
for(int i=0;i<len;i++)
printf(" %d",prime[a++]);
}
printf("\n\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: