java实现验证验证歌德巴赫猜想(简易版)

一、哥德巴赫猜想简单介绍

   哥德巴赫1742年给欧拉的信中哥德巴赫提出了以下猜想:任一大于2的整数都可写成三个质数之和..但是哥德巴赫自己无法证明它,于是就写信请教赫赫有名的大数学家欧拉帮忙证明,但是一直到死,欧拉也无法证明。 因现今数学界已经不使用"1也是素数"这个约定,原初猜想的现代陈述为:任一大于5的整数都可写成三个质数之和。. (n>5:当n为偶数,n=2+(n-2),n-2也是偶数,可以分解为两个质数的和;当n为奇数,n=3+(n-3),n-3也是偶数,可以分解为两个质数的和)欧拉在回信中也提出另一等价版本,即任一大于2的偶数都可写成两个质数之和。. 今日常见的猜想陈述为欧拉的版本。

二、问题分析

  提炼一个简单版本作为小测试,即让用户随机输入一个大于2的偶数,程序输出两个素数,其和为用户输入的数(不再去穷尽无尽大去验证)

三、实现思路

  1. 让用户输入一个大于2的偶数
  2. 将该数拆分为两个数,其和等于该数(可封装一个类来保存这两个数,最终得到是封装类的集合)
  3. 遍历集合,若找到拆分的两个数都是素数,则证明哥德巴赫猜想(封装一个方法来判断是否是素数)

四、代码实现

封装类TwoNumbers

package goldbachconjecture;

/**
 * 用一个封装类来存储拆分的两个值
 */
public class TwoNumbers {
    public int firstNum;
    public int secondNum;

    public TwoNumbers() {
    }

    public TwoNumbers(int firstNum, int secondNum) {
        this.firstNum = firstNum;
        this.secondNum = secondNum;
    }
}

拆分的方法

 //将一个数拆分成两个数的值
    public static List<TwoNumbers> breakUpNumbers(int num) {
        List<TwoNumbers> list = new ArrayList<>();
        //利用循环让该数减去从2到num/2,从而拆分为和为该数的两个数,因为1不是素数,所以从2开始
        for (int i = 2; i <= num / 2; i++) {
            TwoNumbers tn = new TwoNumbers();
            tn.firstNum = i;
            tn.secondNum = num - i;
            list.add(tn);
        }
        return list;
    }

判断是否是素数的方法

  private static boolean isPrime(int Num) {
        //除了1和本身没有其他公因数
        for (int i = 2; i < Num; i++) {
            if (Num % i == 0) {
                return false;
            }//判断数是不是素数
        }
        return true;
    }

验证拆分的数集合中是否存在两素数的方法

 //判断拆分的两个数的集合中是否能找到两个数均为素数的,若找到,则验证了歌德巴赫猜想
    private static boolean isToTwoPrimeNumbers(List<TwoNumbers> list) {
        for (TwoNumbers t:list
             ) {
            //注意此处逻辑,是只要存在有两个数都是素数的情况就返回为真
            if (isPrime(t.firstNum)&&isPrime(t.secondNum)){
                System.out.println("其中:"+t.firstNum+"+"+t.secondNum+"是两个素数的和");
                return true;
            }
        }
        return false;

    }

main函数

public static void main(String[] args) {
        //让用户输入大于2的偶数
        System.out.println("输入一个大于2的偶数");
        Scanner sca = new Scanner(System.in);
        int num = sca.nextInt();
        List<TwoNumbers>list=breakUpNumbers(num);
        System.out.println("可分解为:");
        for (TwoNumbers t:list
             ) {
            System.out.println(t.firstNum +" + "+t.secondNum);
        }
        System.out.println("所以可分为两个素数的和吗?"+isToTwoPrimeNumbers(list));

    }

完整代码(除图一的封装类代码)

package goldbachconjecture;


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//验证歌德巴赫猜想
public  abstract class  GoldbachConjecture {


    public static void main(String[] args) {
        //让用户输入大于2的偶数
        System.out.println("输入一个大于2的偶数");
        Scanner sca = new Scanner(System.in);
        int num = sca.nextInt();
        List<TwoNumbers>list=breakUpNumbers(num);
        System.out.println("可分解为:");
        for (TwoNumbers t:list
             ) {
            System.out.println(t.firstNum +" + "+t.secondNum);
        }
        System.out.println("所以可分为两个素数的和吗?"+isToTwoPrimeNumbers(list));

    }

    //将一个数拆分成两个数的值
    public static List<TwoNumbers> breakUpNumbers(int num) {
        List<TwoNumbers> list = new ArrayList<>();
        //利用循环让该数减去从2到num/2,从而拆分为和为该数的两个数,因为1不是素数,所以从2开始
        for (int i = 2; i <= num / 2; i++) {
            TwoNumbers tn = new TwoNumbers();
            tn.firstNum = i;
            tn.secondNum = num - i;
            list.add(tn);
        }
        return list;
    }
    //判断拆分的两个数的集合中是否能找到两个数均为素数的,若找到,则验证了歌德巴赫猜想
    private static boolean isToTwoPrimeNumbers(List<TwoNumbers> list) {
        for (TwoNumbers t:list
             ) {
            //注意此处逻辑,是只要存在有两个数都是素数的情况就返回为真
            if (isPrime(t.firstNum)&&isPrime(t.secondNum)){
                System.out.println("其中:"+t.firstNum+"+"+t.secondNum+"是两个素数的和");
                return true;
            }
        }
        return false;

    }

    private static boolean isPrime(int Num) {
        //除了1和本身没有其他公因数
        for (int i = 2; i < Num; i++) {
            if (Num % i == 0) {
                return false;
            }//判断数是不是素数
        }
        return true;
    }



}

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值