现在给定一个正整数N,牛牛希望知道N最少表示成多少个素数的和。
素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
提示
哥德巴赫猜想:任意大于2的偶数都可以拆分成两个质数之和。该猜想尚未严格证明,但暂时没有找到反例。
3
1
3本身就是1个素数
6
2
6可以表示为3 + 3,注意同样的素数可以使用多次
(1).如果N是素数,则返回1,否则进入(2);
(2).如果N为偶数,N==2 ,返回1,N != 2,返回2 (哥德巴赫猜想)。否则进入(3);
(3)N为奇数,分解为p=(p-2)+2:
若p-2为质数,则可表示为两个质数的和
若p-2为非质数,则可表示为三个质数的和
需要注意的是,在判断质数函数中,采用平方根可减小整个算法的时间复杂度,否则算法的时间复杂度会超标!
# # 判断给定的正整数最少能表示成多少个素数的和 # @param N int整型 给定的正整数 # @return int整型 # class Solution: def MinPrimeSum(self , N ): # write code here ret = 0 if(N%2 == 0): if(N==2): ret = 1 else: ret = 2 else: if(self.isPrimeNumber(N)): ret = 1 elif(self.isPrimeNumber(N-2)): ret = 2 else: ret = 3 return ret def isPrimeNumber(self,x): import math flag = True if(x==1): flag = False for i in range(2,int(math.sqrt(x))+1): if(x%i==0): flag=False return flag