这道题做的有点复杂了,我的一个思路是先找到输入的n的所有质数存入primes数组里面,然后递归寻找三个数的和。
#include<bits/stdc++.h>
using namespace std;
const int N=20010;
int primes[N],n,ctn,sum,path[N],k;
bool st[N],state[N];
//线性筛质数
void find_Prime(int n){
for(int i=2;i<=n;i++){
if(!st[i]){
primes[ctn++]=i;
}
for(int j=0;primes[j]<=n/i;j++){
st[primes[j]*i]=true;
if(i%primes[j]==0){
break;
}
}
}
}
//找到三个质数和为输入的奇数
void dfs(int u){
if(u==3){
if(sum==n){
k++;
for(int i=0;i<3;i++){
cout<<path[i]<<" ";
}
}
return;
}
if(k==1){
return;
}
for(int i=0;i<ctn;i++){
if(!state[i]){
path[u]=primes[i];
sum+=primes[i];
//state[i]=true;
dfs(u+1);
sum-=primes[i];
//state[i]=false;
}
}
}
int main(){
cin>>n;
find_Prime(n);
dfs(0);
return 0;
}