一道比较有意思的数学题。
首先,根据贪心的原理,最好把全部分成质数。
考虑分类讨论,
1.或,显然答案是
2.且为偶数,也就是,由哥德巴赫猜想,发现可以分成两个质数之和,所以答案为
3.且为奇数,
还是分成两种情况:
a.为质数,答案为,
b.不为质数,发现至少为,这样比较好办,先从里面分出一个,剩下的由哥德巴赫猜想可以分成两个质数,答案为
在具体实现时,发现有更简洁的写法:
if (isprime(n)) p(1);
else if (n%2==0||isprime(n-2)) p(2);
else p(3);
也就是把很多情况合起来写罢了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define p(a) printf("%d\n",a)
using namespace std;
inline bool isprime(register int x){
for (register int i=2;i*i<=x;++i){
if (x%i==0){
return false;
}
}
return true;
}
int main(){
int n;
scanf("%d",&n);
if (isprime(n)) p(1);
else if (n%2==0||isprime(n-2)) p(2);
else p(3);
}