题目描述
牛牛刚刚学习了素数的定义,现在给定一个正整数N,牛牛希望知道N最少表示成多少个素数的和。
素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
提示
哥德巴赫猜想:任意大于2的偶数都可以拆分成两个质数之和。该猜想尚未严格证明,但暂时没有找到反例。
题解:
结合哥德巴赫猜想,
如果N==2,它就是被自身素数构造的,答案是1
如果N>3&&N是偶合数(也就是大于2的偶数)时,根据猜想可以拆分成两个质数之和,所以答案是2
如果N>3&&N是奇合数时,奇合数=奇数+偶数
如果这个偶数是2&&我们只需要判断N-2是否为素数,这样答案是2
如果N-2不是素数,我们可以让奇合数=奇数+偶数中的奇数为素数,又因为偶数(此时不为2)答案是2,所以答案是3
代码:
class Solution {
public:
/** * 判断给定的正整数最少能表示成多少个素数的和 * @param N int整型 给定的正整数 * @return int整型 */
bool iff(int x)
{
if(x==1)return 0;
if(x==2)return 1;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)return 0;
return 1;
}
int MinPrimeSum(int N) {
// write code here
if(iff(N))return 1;
if(N%2==0||iff(N-2))return 2;
return 3;
}
};