两个质数的和是S,他们的积最大是多少?
输入
一个不大于10000的正整数S,为两个质数的和。
输出
一个整数,为两个质数的最大乘积。数据保证有解。
输入样例
21
输出样例
38
题解:
求出≥s的第一个素数,把前面的素数都放入一个数组,然后开一个O(n2)的枚举即可。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <deque>
#include <list>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <iterator>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double E = exp(1.0);
const int MOD = 1e9+7;
const int MAX = 1e5+5;
int s;
int check[MAX];
int prime[MAX];
int tot = 0;
void get_prime()//埃筛素数
{
memset(check,0,sizeof(check));
for(int i = 2; i <= MAX; i++)
{
if(!check[i])
{
prime[tot++] = i;
for(int j = 2*i; j <= MAX; j += i)
{
check[j] = 1;
}
}
}
}
int main()
{
/*
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
*/
get_prime();
for(int i = 0; i < 20; i++)
{
cout << prime[i] << " ";
}
cout << endl;
while(cin >> s)
{
int t = s/2;
int index = lower_bound(prime,prime+tot,s) - prime;
int max_m = -inf;
for(int i = 0; i < index; i++)
{
for(int j = i; j < index; j++)// 注意可以有相同的元素
{
if(prime[i]+prime[j] == s)
{
if(prime[i]*prime[j] > max_m)
max_m = prime[i]*prime[j];
}
}
}
cout << max_m << endl;
}
return 0;
}