题意:给定n c,找出1~n中所有素数,输出以中心对称的部分,如果奇数输出c*2-1个,否则c*2个。
思路:不得不说,题目来回读了三遍都没读懂。。。尼玛我觉得这题表述不清啊,from center什么啊,还是我太渣啊!!
还有!!不得不吐槽数据范围!!说n<=1000,尼玛我打表素数都打了1005个了,就是wa!!找了一天错哪都要疯了,快把整个程序格式化了,尼玛最后发现是数据问题,老子当场就想把题目撕了啊!!撕了!!!
好了。。发泄完了。。 这题还有一个坑爹的格式,一定要严谨啊! 本来看样例,最后一组像是没有空行的样子,还辛辛苦苦特别注意了一下。。 算了算了。元气大伤。。
上代码吧。
对了,素数筛选,打表还是很经典的。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <algorithm>
#include <cstring>
#include <utility>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
int num[1015]; //真是不想吐槽了!!!
bool isPrime(int n)
{
if(n==1) //特殊,1也算
return true;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)
return false;
return true;
}
void table()
{
int t=1;
for(int i=1;i<1015;i++)
{
if(isPrime(i))
num[t++]=i;
}
}
int main()
{
int n,c;
table(); //打表
//printf("%d\n",isPrime(1));
//for(int i=1;i<50;i++)
//printf("%d\n",num[i]);
while(scanf("%d%d",&n,&c)!=EOF)
{
//if(cas) printf("\n");
//cas++;
printf("%d %d:",n,c);
for(int i=1;i<1015;i++)
{
if(num[i]>n)
{
i--;int nn=0; //i表示最后一个,nn计数
//printf("%d\n",i);
if(i+1<c*2) //注意c超标情况
for(int k=1;k<=i;k++)
{
printf(" %d",num[k]);
}
else if(i%2)
{
for(int k=i/2-c/2+1;;k++)
{
nn++;
if(nn>c*2-1) break;
printf(" %d",num[k]);
}
}
else
{
for(int k=i/2-c+1;;k++)
{
nn++;
if(nn>c*2) break;
printf(" %d",num[k]);
}
}
break;
}
}
printf("\n\n");
}
return 0;
}