首页 > 试题广场 >

最少素数拆分

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

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

示例1

输入

3

输出

1

说明

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

输入

6

输出

2

说明

6可以表示为3 + 3,注意同样的素数可以使用多次

备注:
class Solution {
public:
    /**
     * 判断给定的正整数最少能表示成多少个素数的和
     * @param N int整型 给定的正整数
     * @return int整型
     */
    bool isPrime(int n){
        if(n==1)
            return false;
        if(n==2)
            return true;
        for(int i=2;i*i<=n;i++)
            if(n%i==0)
                return false;
        return true;
    }
    int MinPrimeSum(int N) {
        if(N<=1)
            return 0;
        if(N&1){
            if(isPrime(N))
                return 1;
            else{
                if(isPrime(N-2))
                    return 2;
                else
                    return 3;
            }
        }else{
            if(N==2)
                return 1;
            else
                return 2;
        }
    }
};

发表于 2020-08-19 00:59:27 回复(0)
1.一个数是质数,那么表示这个数用一个质数就可以
2.根据歌德巴克猜想猜想大于2的偶数可以用两个质数加和获取
3.如果一个数大于2并且不是偶数,那么有两种情况
-1.这个数-2是一个质数,那么用两个质数就可以表示这个数
-2.这个数-2不是一个质数,那么久-3变为一个偶数,根据任意大于2的偶数可以用两个质数表示,则这个数可以用3个质数来进行表示
import java.util.*;


public class Solution {
    HashSet<Integer> primes = new HashSet<>();
    HashSet<Integer> noPrimes = new HashSet<>();
    {
        primes.add(2);
        primes.add(3);
        primes.add(5);
        primes.add(7);
    }
    /**
     * 判断给定的正整数最少能表示成多少个素数的和
     * @param N int整型 给定的正整数
     * @return int整型
     */
    public int MinPrimeSum (int num) {
        // write code here
        int size=1;
        if(num<=1){
            return 0;
        }
        if(!isPrime(num)){
            if(num%2==0){
                size = 2;
            }else{
                //如果一个数-2是一个质数,而其自身不是质数,那么获取这个数就是一个质数+2
                if(isPrime(num-2)){
                    size=2;
                }else{
                    //如果一个数自身不是一个质数,-2也不是一个质数,那么他就可以根据歌德巴克猜想减去3,成为一个偶数,偶数可以由两个质数获得,再加上3这个质数就是三个
                    size=3;
                }
            }
        }
        return size;
    }
    public boolean isPrime(int num){
        if(primes.contains(num)){
            return true;
        }
        if(noPrimes.contains(num)){
            return false;
        }
        if(num%2==0){
            noPrimes.add(num);
            return false;
        }
        int p = (int)Math.sqrt(num);
        for(int i = 3;i <= p ;i++){
            if(num%i==0){
                noPrimes.add(num);
                return false;
            }
        }
        primes.add(num);
        return true;
    }
}


发表于 2020-07-12 11:05:46 回复(0)

网络问题无法提交 一直在转圈,让我以为写了个死循环,改了好几次,后来用的手机热点

func MinPrimeSum(N int) int {
    res := 0
    if N == 0 || N == 1 {
        return res
    }
    if N%2 == 0 {
        if N == 2 {
            res = 1
        } else {
            res = 2
        }
    } else {
        if isSU(N) {
            res = 1
        } else {
            if isSU(N - 2) {
                res = 2
            } else {
                res = 3
            }

        }
    }
    return res
}
func isSU(n int) bool {
    for i := 2; i < n; i++ {
        if n%i == 0 {
            return false
        }
    }
    return true
}
编辑于 2021-06-04 17:37:31 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 判断给定的正整数最少能表示成多少个素数的和
     * @param N int整型 给定的正整数
     * @return int整型
     */
    public int MinPrimeSum (int N) {
        // write code here
        if(isPrime(N))return 1;
        if(N%2==0 || isPrime(N-2))return 2;
        return 3;
    }
    
    public boolean isPrime(int n){
        for(int i=2; i*i<=n; i++){
            if(n%i==0){
                return false;
            }
        }
        return true;
    }
}

发表于 2021-02-04 10:08:23 回复(0)

(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)

素数一定是一个奇数(不包括2)
N=0或1,返回0
N是偶数(不包括2)对应的最小的素数的个数是2;
N是奇数,如果N是素数,对应的最小的素数的个数则为1,否则,可能是2,或者是3,
如果是2,如:N=a+b,a,b不可能是即是两个奇数,有是两个素数,a,b必有一个是2,否则是偶数,矛盾。
所以如果N-2是素数,则返回2,否则,返回3。

 int MinPrimeSum(int N) 
    {
       int res=0;
       if(N==0||N==1)
           return res;
       if(N%2==0)
       {
           if(N==2)
               res=1;
           else
               res=2;
       }
        else
        {
            if(isprime(N))
                res=1;
            else 
            {
                //若num是奇数且不是素数,
                
                那么2<=res<=3,若N-2是素数则,res=2,若N-2不是素数,则
                if(isprime(N-2))
                    res=2;
                else 
                    res=3;
            }
        }
       return res;
    }
    bool isprime(int N)
    {
        for(int i=2;i<=(int)sqrt(N);i++)
        {
            if(N%i==0)
                return false;
        }
        return true;
    }



编辑于 2020-05-10 11:06:01 回复(0)
跟上面车站建造问题一样
class Solution {
public:
	int MinPrimeSum(int N) {
		if (is_prime(N))        //判断是否为素数
			return 1;
		else
		{
			if (N % 2 == 0)    //判断是否为偶数
				return 2;
			else
			{
				if (is_prime(N - 2))    //判断n-2是否为素数
					return 2;
				else
					return 3;
			}
		}
	}

	bool is_prime(int n)
	{
		for (int i = 2; i <= sqrt(n); i++)
			if (n % i == 0)
				return false;
		return true;
	}
};

编辑于 2020-04-18 21:09:03 回复(0)
/*
分类讨论:
1. 对于质数:返回1
2. 对于偶数(大于等于4),根据哥德巴赫猜想,都可以分解为两个质数的和,返回2
3. 对于非质数的奇数:如果该奇数-2为质数,返回2;否则返回3

*/

class Solution {
public:
    /**
     * 判断给定的正整数最少能表示成多少个素数的和
     * @param N int整型 给定的正整数
     * @return int整型
     */
    int MinPrimeSum(int N) {
        // write code here
        int i;
        bool flag1 = 0, flag2 = 0;
        if(N == 2) {
            return 1;
        }
        else if(N%2 == 0) {
            return 2;
        }
        for(i = 3; i*i <= N; i = i + 2) {
            if(N%i == 0) {
                flag1 = 1;
            }
            if((N-2)%i == 0) {
                flag2 = 1;
            }
        }
        
        if(flag1 == 0) {
            return 1;
        }
        else if(flag1 == 1 && flag2 == 0) {
            return 2;
        }
        else {
            return 3;
        }
    }
};

发表于 2020-03-14 14:25:37 回复(0)

问题信息

难度:
8条回答 6403浏览

热门推荐

通过挑战的用户

查看代码