goj 数数?诶?这么简单?
Problem Description:
当看到GDUFE-GAME宣传海报上提到"场内人员可以在任意区域组织游戏"时,QWER按不住自己蠢蠢欲动的心,当场就出了一道题:定义QWER数为任意相邻两个素数之和加上1且是素数的数(eg: 6 = 2 + 3 + 1, 6不是素数, 所以6不是QWER数; 13 = 5 + 7 + 1, 13是素数,所以13是QWER数),给出一个数字n,10秒内求出1到n之间所有QWER数便能获得QWER的一次拥抱。作为QWER的迷弟/迷妹,你也按不住自己放在键盘上的麒麟臂,飞速得写代码,准备去收下QWER的拥抱。
Input:
数据包括多个测试实例。 每个测试实例包含一个整数 n (15 ≤ n ≤ 1000000)。
Output:
对于每个测试实例,从小到大输出 1 到 n 之间所有的QWER数(每个QWER数之间间隔一个空格)。
Sample Input:
15 20
Sample Output:
13 13 19
解题思路:先用线性筛打素数表,接下来给定范围内枚举相邻的素数和加1是否满足是素数且不超过n则保存在qwer数组中,最后输出。要用线性筛啊,不然老TLE!!!
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define MAXSIZE 1000000 4 bool isp[MAXSIZE]; 5 int prime[MAXSIZE],qwer[MAXSIZE];//保存素数 6 int main() 7 { 8 int cnt=0; 9 memset(isp,true,sizeof(isp)); //打素数表 10 memset(prime,0,sizeof(prime)); 11 isp[0]=isp[1]=false; 12 for(int i=2;i<MAXSIZE;++i){ 13 if(isp[i]) 14 prime[++cnt]=i;//从下标1开始保存素数 15 for(int j=1;j<=cnt && i*prime[j]<MAXSIZE;++j){ 16 isp[i*prime[j]]=false; 17 if(i%prime[j]==0) 18 break; 19 } 20 } 21 int tmp,k,n; 22 while(cin>>n){ 23 tmp=k=0; 24 for(int i=2;prime[i]<=n;++i){ //从2开始枚举 25 tmp=prime[i-1]+prime[i]+1; 26 if(tmp>n)break; 27 if(isp[tmp])qwer[++k]=tmp; 28 } 29 for(int i=1;i<k;++i) 30 cout<<qwer[i]<<' '; 31 cout<<qwer[k]<<endl; 32 } 33 return 0; 34 }