Java题解 |HJ60#查找组成一个偶数最接近的两个素数#
查找组成一个偶数最接近的两个素数
https://www.nowcoder.com/practice/f8538f9ae3f1484fb137789dec6eedb9
描述
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对
输入描述: 输入一个偶数
输出描述: 输出两个素数
示例1
输入 20 输出 7 13
解法
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。
- 要求两个数插值最小,自然是两个数大小最接近。因此,先对偶数n折半作为遍历的起点,分为 n/2 和 n-n/2 两个数。
- 判断这两个数 n/2+1 和 n/2-1 是否是素数。如果是,那么计算就结束,输出这两个数即可;如果不是,这两个数分别加1和减1,再次判断是否是素数,因此类推。
/*
* Copyright (c) waylau.com, 2022. All rights reserved.
*/
package com.waylau.nowcoder.exam.oj.huawei;
import java.util.Scanner;
/**
* HJ60 查找组成一个偶数最接近的两个素数。
* 描述:任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,
* 本题目要求输出组成指定偶数的两个素数差值最小的素数对
* 输入描述: 输入一个偶数
* 输出描述: 输出两个素数
* 示例1
* 输入
* 20
* 输出
* 7
* 13
*
* @author <a href="">Way Lau</a>
* @since 2022-08-26
*/
public class HJ060FindsTheTwoClosestPrimeNumberThatMakeUpEvenNumber {
public static void main(String[] args) {
// 输入
Scanner in = new Scanner(System.in);
int n = in.nextInt();
// 折半
int n1 = n / 2;
int n2 = n - n1;
while (0 < n1 && n2 < n) {
if (isPrime(n1) && isPrime(n2)) {
// 输出
System.out.println(n1);
System.out.println(n2);
break;
}
n1 -= 1;
n2 += 1;
}
// 关闭
in.close();
}
// 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数
// 0和1既不是质数也不是合数,最小的质数是2
private static boolean isPrime(int n) {
if (n <= 1) {
return false;
} else {
for (int i = 2; i < n; i++) {
if (n % i == 0) {
return false;
}
}
}
return true;
}
}
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html