这个题要特别注意time limit per test: 0.5 sec. memory limit per test: 4096 KB,所以在构造素数表以及标记数组都要特别注意。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int isprime(int n)
{
for(int i=2; i*i<=n; i++)
if(n%i==0)
return 0;
return 1;
}
int main()
{
int count=0;
int n;
//while( scanf("%d",&n)!=EOF)//题目中说输入只有一个数,所以这样写会PE
scanf("%d",&n);
{
bool prime[n+1];//用int会超内存的。
//for(int i=0; i<=n&&i<2; i++)
//prime[i]=false;
/*for(int i=2; i<=n; i++)
{
prime[i]=false;
if(isprime(i))//这样构造素数表会超时
prime[i]=true;
}*/
for(int i=0; i<=n; i++)
{
if(i==0||i==1)
prime[i]=false;
else prime[i]=true;
}
for(int i=2; i*i<=n; i++)
{
for(int j=i; i*j<=n; j++)
{
prime[i*j]=false;
}
} //学习这种构造素数表的方法
//for(int i=0; i<=n; i++)
//if(prime[i])
// cout<<i<<endl;
for(int i=0; i<n; i++)
{
if(2+i<=n&&prime[i]&&prime[i+2])
count++;
}
cout<<count;
if(count)
for(int i=0; i<n; i++)
{
if(2+i<=n&&prime[i]&&prime[i+2])
cout<<" "<<"2"<<" "<<i;
}
cout<<endl;
}
return 0;
}