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

58 篇文章 0 订阅
50 篇文章 0 订阅

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[n]);
		printf("%d %d:",n,c);
		if(c*2>	cnt[n])            //WA在这,题目说的如果超过个数那就输出1~n
		{
			for(int i=0;i<cnt[n];i++)
				printf(" %d",prime[i]);
		}
		else if(cnt[n] & 1) //odd   c*2-1     cnt[n]=a+c*2-1+a -> a=(cnt[n]+1)/2-c
		{
			int a=(cnt[n]+1)/2-c;
			int len=2*c-1;
			for(int i=0;i<len;i++)
				printf(" %d",prime[a++]);
		}
		else   //even  c*2    cnt[n]=a+c*2+a -> a=(cnt[n])/2-c
		{
			int a=(cnt[n])/2-c;
			int len=2*c;
			for(int i=0;i<len;i++)
				printf(" %d",prime[a++]);
		}
		printf("\n\n");
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值