首页 > 试题广场 >

最少素数拆分

[编程题]最少素数拆分
  • 热度指数:4054 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
现在给定一个正整数N,牛牛希望知道N最少表示成多少个素数的和。
素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

提示
哥德巴赫猜想:任意大于2的偶数都可以拆分成两个质数之和。该猜想尚未严格证明,但暂时没有找到反例。

示例1

输入

3

输出

1

说明

3本身就是1个素数
示例2

输入

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
编辑于 2020-07-27 21:01:04 回复(0)

问题信息

难度:
1条回答 6451浏览

热门推荐

通过挑战的用户

查看代码