参考代码: 朴素法求素数,dfs找质数中的三个数,若和为n,直接退出,测地终止;不需要回溯,因为可能三个质数都相同,不一定不同;
#include <stack>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAX 5010
using namespace std;
int n, pos;
int primes[5000], cnt, S[5];
bool vis[25000];
void get_primes(int N)
{
for(int i = 2; i <= N; i++)
{
if(vis[i]) continue;
primes[cnt++] = i;
for(int j = i; j <= N; j += i) vis[j] = true;
}
}
void dfs(int k)
{
if(k > 3)
{
if(S[1] + S[2] + S[3] == n) {cout << S[1] <<" "<< S[2] <<" "<< S[3] << endl; pos = 1; return;}
return;
}
if(pos == 1) return;
for(int i = 0; i < cnt; i++)
{
S[k] = primes[i];
dfs(k + 1);
}
return;
}
int main()
{
cin >> n;
get_primes(n);
dfs(1);
return 0;
}