华为机试-060-简单-HJ60.查找组成一个偶数最接近的两个素数
一、描述
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。
数据范围:输入的数据满足 4 ≤ n ≤ 1000
1.1、输入描述
输入一个大于2的偶数
1.2、输出描述
从小到大输出两个素数
二、示例
2.1、示例1
输入:
20
输出:
7
13
2.2、示例2
输入:
4
输出:
2
2
三、答案(java)
3.1、方法一:穷举
解题思路:
对于一个数字,我们可以从2遍历到n,寻找两个加数都是素数的情况,然后比较素数之间的差值,把要输出的变量更新为更小的差值及这两个变量,最后枚举完得到就是差值最小的两个素数。
算法流程:
- 从2开始穷举,直到num
- 如果
isPrime(i) && isPrime(num - i)
判断是否素数后,保存两数之差最小的两个元素
package com.tzq.hwod;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int num = scanner.nextInt();
solution(num);
}
}
private static void solution(int num) {
int min = Integer.MAX_VALUE;
int[] res = new int[2];
// 从2开始穷举
for (int i = 2; i < num; i++) {
if (isPrime(i) && isPrime(num - i)) {
// 保存最接近的两个素数
if (Math.abs(num - i - i) < min) {
res[0] = i;
res[1] = num - i;
min = Math.abs(num - i - i);
}
}
}
System.out.println(res[0] + "\n" + res[1]);
}
// 判断是否素数
private static boolean isPrime(int num) {
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
3.2、方法二:穷举优化
解题思路:
采取从中间向两边枚举的方式,这样贪心的控制住两素数之差距离最小的这个限制
算法流程:
- 对于每个数字,从最接近的两个中位数开始处理判断是否素数
- 如果两个组成偶数的数字都是素数,因为是从最接近的两个数开始枚举,因此一旦都是素数则输出并返回,得到结果
package com.tzq.hwod;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int num = scanner.nextInt();
solution(num);
}
}
private static void solution(int num) {
// 如num=10, 遍历:5,6,7,8
// 从最接近的两个中位数开始处理判断
for (int i = num / 2; i < num - 1; i++) {
if (isPrime(i) && isPrime(num - i)) {
System.out.println((num - i) + "\n" + i);
return;
}
}
}
// 判断是否素数
private static boolean isPrime(int num) {
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
四、答案(python 3)
4.1、方法一
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def isSuShu(x):
if x <= 2:
return True
else:
for i in range(2, int(x ** 0.5) + 1):
if x % i == 0:
return False
else:
return True
while True:
try:
n = int(input())
for i in range(int(n / 2), n):
if isSuShu(i) and isSuShu(n - i):
print(n - i)
print(i)
break
except:
break