题目描述
哥德巴赫猜想认为:不小于4的偶数都可以表示为两个素数的和。
你不需要去证明这个定理,但可以通过计算机对有限数量的偶数进行分解,验证是否可行。
实际上,一般一个偶数会有多种不同的分解方案,我们关心包含较小素数的那个方案。
对于给定数值范围,我们想知道这些包含较小素数方案中最大的素数是多少。
比如,100以内,这个数是19,它由98的分解贡献。
你需要求的是10000以内,这个数是多少?
解法一
解题思路
1.编写is_prime()函数判断一个数是否为负数
2.求2~10000内每一个偶数写成两个质数的表达形式,j + (i - j) = i,j和j-i都为素数,且j < i - j
3. 求所有j中最大的那个j
python代码
#哥德巴赫分解,答案173
import math
def is_prime(num): #判断一个数是否为质数,是返回true
if num == 1:
return False
for i in range(2,int(math.sqrt(num))+1):
if num % i == 0:
return False
return True
def solution(n):
ans = 0
for i in range(n,2,-2):
for j in range(2,(i//2+1)):
if is_prime(j) and is_prime(i-j):
ans = max(ans,j)
break
return ans
if __name__ == '__main__':
n = 10000
ans = solution(n)
print(ans)
运行结果
java代码
/*哥德巴赫分解,答案173*/
public class homework04 {
/*
* 判断一个数是否为素数,是返回true*/
private static boolean is_prime(int num) {
if (num == 1)
return false;
for (int i = 2; i < (int)(Math.sqrt(num) + 1); i++) {
if (num % i == 0)
return false;
}
return true;
}
/*返回两个数间的最大值*/
private static int max(int a,int b) {
if (a > b)
return a;
return b;
}
private static int solution(int n) {
int ans,i,j;
ans = 0;
for(i = n; i > 2; i -= 2) {
for (j = 2; j < (i/2 + 1); j++) {
if (is_prime(j) && is_prime(i-j)) {
ans = max(ans,j);
break;
}
}
}
return ans;
}
public static void main(String[] args) {
int n,ans;
n = 10000;
ans = solution(n);
System.out.println(ans);
}
}