题意:
现在有一个奇数n,让你求把这个奇数拆成小于等于3个素数的和的方案。
思路:
首先我们肯定是从大到小枚举素数,然后如果n还没被减完,那么我们从小到大枚举素数,然后如果是素数的话,那么就把它存下来,然后直到满足为止。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef __int64 ll;
ll a[4];
bool is_prime(ll n){
for(int i=2;i*i<=n;i++){
if(n%i==0) return false;
}
return true;
}
int main(){
ll n;
scanf("%I64d",&n);
ll ans=0;
int cnt=0;
for(int i=n;i>=1;i--){
if(is_prime(i)){
ans=i;
a[cnt++]=i;
break;
}
}
ans=n-ans;
if(ans<=0){
printf("%d\n",cnt);
for(int i=0;i<cnt;i++){
if(i!=cnt-1) printf("%I64d ",a[i]);
else printf("%I64d\n",a[i]);
}
}
else{
if(is_prime(ans)){
a[cnt++]=ans;
printf("2\n");
for(int i=0;i<cnt;i++) printf("%I64d%c",a[i],i==cnt-1?'\n':' ');
}
else{
for(int i=2;i<=ans;i++){
if(!is_prime(i)) continue;
ll tmp=ans-i;
if(is_prime(tmp)){
a[cnt++]=i;
a[cnt++]=tmp;
break;
}
}
printf("3\n");
for(int i=0;i<cnt;i++) printf("%I64d%c",a[i],i==cnt-1?'\n':' ');
}
}
}