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 }
View Code

 

posted on 2013-09-13 11:18  码农之上~  阅读(300)  评论(0编辑  收藏  举报

导航