POJ 1595 Prime Cuts

题意:输入两个数n和c你需要输出1~n中,所有素数中间2*c-1个素数如果其中有奇数个素数,如果是偶数个输出2*c个。

思路:打素数表,然后通过二分法找到两头素数,之后再取中间。

代码如下:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
int prime[500005];
bool bo[1000005];
int prime_table()
{
  int flag=1,i,j;
  memset(bo,0,sizeof(bo));
  bo[0]=bo[1]=1;
  for(i=2;i<=1000;i++)
  {
    if(!bo[i])
    {
      j=i*i;
      for(;j<=1000000;j+=i)
      {
        bo[j]=1;
      }
    }
  }
  for(i=0;i<=10000;i++)
  {
    if(!bo[i])
      prime[flag++]=i;
  }
  return flag;
}
int ans;
int Search(int x)
{
  int left=0,right=ans,mid;
  while(left<=right)
  {
    mid=(left+right)>>1;
    if(prime[mid]==x)
    {
      return mid+1;
    }
    if(prime[mid]<x&&prime[mid+1]>x)
    {
      return mid+1;
    }
    if(prime[mid]>x&&prime[mid-1]<x)
    {
      return mid;
    }
    if(prime[mid]<x)
    {
      left=mid+1;
    }
    if(prime[mid]>x)
    {
      right=mid-1;
    }
  }
}
int main()
{
  int n,c;
  ans=prime_table();prime[0]=1;
  while(~scanf("%d%d",&n,&c)){
  int sum=Search(n);
  //printf("%d\n",sum);
  printf("%d %d: ",n,c);
  if(sum%2==0)
  {
    int cnt=(sum-2*c)/2;int t=2*c;
    if(t>sum)
    {
      for(int i=0;i<sum-1;i++)
      {
        printf("%d ",prime[i]);
      }
      printf("%d\n\n",prime[sum-1]);
    }
    else{
    while(t>1)
    {
      t--;
      printf("%d ",prime[cnt]);
      cnt++;
    }
    printf("%d\n\n",prime[cnt]);
    }
  }
  else
  {
    int cnt=(sum-(2*c-1))/2;int t=2*c-1;
    if(t>sum)
    {
      for(int i=0;i<sum-1;i++)
      {
        printf("%d ",prime[i]);
      }
      printf("%d\n\n",prime[sum-1]);
    }
    else{
    while(t>1)
    {
      t--;
      printf("%d ",prime[cnt]);
      cnt++;
    }
    printf("%d\n\n",prime[cnt]);
    }
  }
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值