题目描述
小明最近开始研究质数的问题,被神奇的质数深深地吸引了。就在昨天,他在一张纸上写下了两个质数,并在另一张纸上写下了两个质数之和,且打算今天研究两个数的乘积。可是一早起来,发现写了两个质数的纸不见了,只剩下写有两个质数之和的纸。这可把小明急坏了。
幸好今天一早有大批参加程序设计竞赛的编程高手在这里,请你根据小明写下的两个质数之和,得到两个质数的乘积,如果有多种可能,输出其中最大的那个乘积。
输入
一个不大于100000的正整数S,为两个质数的和。
输出
一个整数,为两个质数的最大乘积。数据保证有解。
样例输入
【样例1】
5
【样例2】
50
样例输出
【样例1】
6
【样例2】
589
解题思路:
题目意思很好理解,就是求x是否为素数,如果是素数,判断i-x是否为素数。暴力枚举即可
只不过我写的时候先用了一个函数判断s以内的素数(筛法判断)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100005],s,i;
ll z,maxn,x;
void fun(ll x){ //筛法求素数
int i,j;
for(i=2;i<=sqrt(x);i++)
{
if(a[i]==0){
for(j=i*i;j<x;j=j+i)
a[j]=1;
}
}
}
int main(){
cin>>s;
fun(s);
for( i=s-2;i>=2;i--){ //枚举每个值
if(a[i]==0) { //i是否为素数
x=s-i;
if(a[x]==0) { //s-i是否为素数
z=x*i;
maxn=max(maxn,z);
}
}
}
cout<<maxn<<endl;
return 0;
}