题目大意:给出两个数,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
9
using namespace std;
10
11
bool pri[20000000];
12
int pr[1500000];
13
int summ,T,a,b,m,maxx;
14
bool f;
15
vector<int> dis[150];
16
17
void 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
37
int 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