现在给定一个正整数N,牛牛希望知道N最少表示成多少个素数的和。
素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
提示
哥德巴赫猜想:任意大于2的偶数都可以拆分成两个质数之和。该猜想尚未严格证明,但暂时没有找到反例。
3
1
3本身就是1个素数
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; } } };
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; } }
网络问题无法提交 一直在转圈,让我以为写了个死循环,改了好几次,后来用的手机热点
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 }
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; } }
(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
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; }
跟上面车站建造问题一样 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; } };
/* 分类讨论: 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; } } };