hanrui_l @ 2018-05-11 11:18:55
//思路:先找到第三个质数(最大的),根据输入数与第三个质数的差去找前两个质数(前两个质数的和==差),找到的两个质数必然是最小的。
#include <cmath>
using namespace std;
bool susu(int m)
{
if(m==1) return 0;
for(int i=2;i<=sqrt(m);i++)
{
if(m%i==0) return 0;
}
return 1;
}
int main()
{
int n;
cin>>n;
for(int i=n-1;i>9;i--) //找n下面最大的质数开始判断
{
if(susu(i))
{
int p=n-i;
if(p>3 && p%2==0) //前两个质数的和必然是偶数,且最小是4
{
for(int j=2;j<p;j++)
{
for(int k=j;k<=p-j;k++)
{
if(susu(j)&&susu(k) &&n==i+j+k)
{
cout<<j<<" "<<k<<" "<<i;
return 0;
}
}
}
}
}
}
return 0;
}
by 准点的星辰 @ 2018-05-16 18:52:47
什么??我们都是先找两个最小的素数,然后减出来第三个,在判断是否为素数。
by hanrui_l @ 2018-05-16 20:41:35
觉得这个思路应该是对的啊: 1.若输入的数为n,先找到小于n的最大的那个质数x; 2.求n-x,设y=n-x吧; 3.然后从最小质数开始找,找到两个质数的和是等于y的,如果能找到,那么这两个质数一定是最小的两个质数;(前提是y一定>=4) 4.如果找不到,就回到第1步,找离n最近的第2个质数,这样一直循环下去,直到找到符合条件的最大质数; 这样通过差值来找,要比一开始就从最小的质数找起来要快很多吧? 不直到问题处在哪里?
by 风水戏诸侯 @ 2019-01-16 23:58:13
第10个 in: 19813 out:3 17 19793