HDU 4715 Difference Between Primes
这道题就是一个打表题。
题目链接:http://code.hdu.edu.cn/showproblem.php?pid=4715
把range范围内的素数打一个表,再有一个判断一个数是否为素数的表。
因为 n>2 ,所以要求的两个数肯定是一个大于n一个小于n。
在素数表寻找第一个比n大的数,设为B,判断B-n是否为素数,是的话就输出,否则继续循环。
上代码:
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 #include<queue> 5 #include<math.h> 6 #include<algorithm> 7 #include<string.h> 8 9 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) ) 10 #define repAE(p,q,i) for( int (i)=(p); (i)<=(q); ++(i) ) 11 #define repD(p,q,i) for( int (i)=(p); (i)!=(q); --(i) ) 12 #define repDE(p,q,i) for( int (i)=(p); (i)>=(q); --(i) ) 13 #define range 10000100 14 15 bool Is[range]; 16 int prime[range]; 17 int end; 18 19 void made(); 20 21 int main() 22 { 23 made(); 24 int test,n,right; scanf("%d",&test); 25 while(test--) 26 { 27 scanf("%d",&n); 28 right=0; 29 for(right=0; right!=end; ++right) 30 if( prime[right] > n ) 31 break; 32 int temp; 33 for(right; right!=end; ++right) 34 { 35 temp=prime[right] - n ; 36 if( Is[temp] ) break ; 37 } 38 printf("%d %d\n",prime[right],temp); 39 } 40 return 0; 41 } 42 43 void made() 44 { 45 repA(0,range,i) Is[i]=true; 46 Is[0]=Is[1]=false; 47 int i,j; 48 for(i=2; i!=range; ++i) 49 { 50 if( Is[i] ) 51 for(j=2*i; j<range; j+=i) 52 Is[j]=false; 53 } 54 end=0; 55 repA(0,range,i) 56 if(Is[i]) prime[end++] = i; 57 return ; 58 }
To Be The Best Of Yourself