题目大意:给出两个数,a,b(均小于等于150),让他们加上一个数使得他们得到的数是素数,并且两个素数相邻,如果存在这样的数,则输出,否则,输出-1
解题思路:1)a,b均小于或等于150,那么加上后素数的差值绝对小于150
2)存在相邻素数小于150的素数范围感觉应该不大...暴力筛一下,看到哪里的间隔会大于150;
3)开一个数组,dis[i][j],表示两个差距为i的两个相邻素数中,较小的那个素数是dis[i]中第j小的
4)接下来就是枚举了,先算差值m,然后套到dis[m]中求不比给定的数a,b小的最小素数,有就输出,没有就输出-1
第一次用vector ~~~
代码:
1#include <iostream>
2#include <cstdlib>
3#include <vector>
4#include <algorithm>
5#include <cstdio>
6#include <cstring>
7#include <cmath>
8
9using namespace std;
10
11bool pri[20000000];
12int pr[1500000];
13int summ,T,a,b,m,maxx;
14bool f;
15vector<int> dis[150];
16
17void prime()
18{
19 memset(pri,0,sizeof(pri));
20 for(int i=2;i<20000000;i++)
21 {
22 if(pri[i]==true) continue;
23 for(int j=i+i;j<20000000;j+=i)
24 {
25 pri[j] = true;
26 }
27 }
28 summ=0;
29 for(int i=2;i<20000000;i++)
30 {
31 if(pri[i]) continue;
32 pr[summ] = i;
33 summ++;
34 }
35}
36
37int main()
38{
39
40 prime();
41 for(int i=0;i<summ-1;i++)
42 {
43 if(pr[i+1]-pr[i]>149) continue;
44 dis[pr[i+1]-pr[i]].push_back(pr[i]);
45 }
46 cin >> T;
47 for(int i=1;i<=T;i++)
48 {
49 cin >> a >> b;
50 m=abs(a-b);
51 if (a>b) maxx=b;
52 else maxx=a;
53 f=true;
54 cout << "Case " << i << ": ";
55 for(int j=0;j<dis[m].size();j++)
56 {
57 if(dis[m][j]<maxx) continue;
58 cout << dis[m][j]-maxx<< endl;
59 f=false;
60 break;
61 }
62 if(f==true) cout << "-1" << endl;
63 }
64}
65