验证哥德巴赫猜想:任何一个大于6的偶数,都能分解成两个质数的和,要求输入一个整数,输出这个数被被分解成哪两个质数的和。如:14
14 = 3 + 11
14 = 7 + 7
第一种:循环判断实现
public static void main(String[] args) {
gdbh(14);
}
//3.验证哥德巴赫猜想:任何一个大于6的偶数,都能分解成两个质数的和,
// 要求输入一个整数,输出这个数被被分解成哪两个质数的和。
public static void gdbh(int num) {
//定义两个变量表示分解出来的两个数,
//判断这两个数是否是质数。
//如果满足条件就输出这两个数 14=2 12、3 11、4 10、5 9、6 8、7 7、8 6
int num1,num2;
//为什么不从2开始,因为2是最小的质数且是一个偶数,偶数减去2,是一个偶数,不可能是质数,故可以忽略
//为什么传入的num/2,因为14=3+11和14=11+3是一样,除以2排除掉重复
for(num1 = 3; num1 <= num/2 ; num1++) {
num2 = num - num1;
if(isZS(num1)&&isZS(num2)) {
System.out.println(num +"="+num1+ "+" +num2);
}
}
}
//定义一个方法判断某个数是否是质数
public static boolean isZS(int n) {
for (int i = 2; i < n; i++) {
if(n % i == 0) {
return false;
}
}
return true;
}
第二种:接口回调实现
接口回调:先有接口的调用者,后有接口的实现者
①接口
//此接口的作用是判断数字是否是质数
interface MyInterface{
boolean isZS(int num);
}
②工具
//此方法已经调用了接口中的方法
public static void gdbl(int num,MyInterface myInterface) {
int num1;
for (num1 = 3; num1 <= num/2 ; num1++) {
if(myInterface.isZS(num1)&& myInterface.isZS(num-num1)) {
System.out.println(num+"=" + num1 + "+" + (num-num1));
}
}
}
③接口的实现者
//这是接口的实现者,在调用工具前,需要有接口的实现
class MyInterfaceImpl implements MyInterface{
@Override
public boolean isZS(int num) {
for (int i = 2; i < num; i++) {
if(num % i == 0) {
return false;
}
}
return true;
}
}
④工具的调用者
public static void main(String[] args) {
//使用工具
gdbl(14, new MyInterfaceImpl() );
}
接口回调的编码顺序①②③④
第三种:用Lambda表达式和函数式接口中的断言型接口对哥德巴赫猜想进行改进
Lambda表达式就是对匿名内部类的简化
函数式接口:
- 如果一个接口只有一个抽象方法,则该接口称之为函数式接口。
- 函数式接口可以使用Lambda表达式,Lambda表达式会被匹配到这个抽象方法上 。
- @FunctionalInterface 注解检测接口是否符合函数式接口规范。
断言型接口的特点:有参数类型,返回值为boolean
public static void test01(int num, Predicate<Integer> predicate){
int num1 = 0;
for (num1 = 3; num1 <= num/2; num1++) {
//使用这个接口判断是否是质数
if(predicate.test(num1) && predicate.test(num - num1)){
System.out.println(num+"="+num1+"+"+(num-num1));
}
}
}
}
public static void main(String[] args) {
//num表示test01方法中的参数,在test01方法中将num形参传给test,所以此处num就是14
test01(14,num -> {
//这个相当于是在predicate.test(){}中的方法,当调用方法test01中的抽象类时
//会调用此处的匿名实现类中的方法,此处实现了接口的方法
for (int i = 2; i < num; i++) {
if(num % i == 0){
return false;
}
}
return true;
});
输出结果:
14=3+11
14=7+7