实现哥德巴赫猜想的三种方法

验证哥德巴赫猜想:任何一个大于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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值