两层循环找到其中两个值,最后一个值由输入的num减去他们的和可得到,若都是质数则可以输出
筛法选素数可稍微优化判断素数的时间
代码如下
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cmath>
#include<iostream>
#include<string>
using namespace std ;
const int MAXN = 20005 ;
bool flag[MAXN] ;
void erat( int num ){
memset( flag , true , sizeof(flag) ) ;
flag[0] = flag[1] = 0 ;
for ( int i = 2 ; i <= num ; i ++ ){
if ( flag[i] ){
for ( int j = i * i ; j <= num ; j += i ){
flag[j] = 0 ;
}
}
}
return ;
}
int main(){
int n ;
cin >> n ;
erat(n) ;
for ( int i = 2 ; i < n ; i ++ ){
for ( int j = 2 ; j < n ; j ++ ){
int num = n - i - j ;
if ( flag[num] && flag[i] && flag[j] ){
cout << i << " " << j << " " << num ;
return 0;
}
}
}
return 0 ;
}