黑马程序员技术交流社区

标题: 题目:一个偶数总能表示为两个素数之和。 [打印本页]

作者: 小蔡@¥¥¥    时间: 2016-8-25 22:55
标题: 题目:一个偶数总能表示为两个素数之和。
各位大神,编程怎么解决啊?
作者: 小蔡@¥¥¥    时间: 2016-8-25 22:59
题目:一个偶数总能表示为两个素数之和。
作者: 坚持努力wbj    时间: 2016-8-26 09:56
好像不是所有的偶数都可以啊
[Java] 纯文本查看 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import org.omg.CORBA.PUBLIC_MEMBER;

/**
* 将一偶数变成两素数之和
* 思路
* 获取偶数
* 获取小于它的素数List
* 遍历相加以验证
* @author Administrator
*
*/
public class OuShuHuanChengLiangSuShuHe {
/**
* 素数集合
*/
        List<Integer> listOfSuShu;
        /**
         * 构造器,初始化listOfShuSu
         */
        public  OuShuHuanChengLiangSuShuHe(){
                this.listOfSuShu=new ArrayList<Integer>();
        }
        /**
         * main
         */
        public static void main(String[] args) {
                int check=2;
                do{OuShuHuanChengLiangSuShuHe it=new OuShuHuanChengLiangSuShuHe();
                        System.out.print("请输入一偶数:");
                        Scanner input=new Scanner(System.in);
                        int ouShu=input.nextInt();
                        it.listOfSuShu=it.getSuShu(ouShu);
                        List<Integer>result=it.change(ouShu, it.listOfSuShu);
                        //打印输出结果
                        if(result.size()==0){
                                System.out.println("该数不可以转换");
                        }else{
                                System.out.print(ouShu+"可以由下面数字相乘得来:");
                                for(int i:result){
                                        System.out.print(i+" ");
                                }
                                System.out.println();
                        }
                        System.err.println("是否继续(1.是 2.否)");
                        do{check=input.nextInt();
                        if(check==1||check==2){
                                break;
                        }
                        System.out.print("输入错误,重新输入:");
                        }while(true);
                }while(check==1);
        }
        /**
         * 获取素数
         */
        public List<Integer> getSuShu(int oushu) {
                List<Integer> sushus=new ArrayList<Integer>();
                class Inner{
                        boolean check(int m){
                               for(int j=2;j<m;j++){
                                            if(m%j==0){
                                                return false;
                                        }
                                }return true;
                        }
                        }
                Inner inner=new Inner();
                for(int i=1;i<oushu;i++){
                        if(inner.check(i)){
                                sushus.add(i);
                        }
                        }

                System.out.print("小于"+oushu+"的素数如下所示");
                for(int i:sushus){
                        System.out.print(i+" ");
                }
                System.out.println();
                return sushus;
        }
        /**
         * 获取可以转换的素数
         * @param oushu
         * @param list
         * @return
         */
        public List<Integer> change(int oushu,List<Integer> list){
                List<Integer>result=new ArrayList<Integer>();
                for(int i=0;i<list.size();i++){
                        for(int j=0;j<list.size()&&j!=i;j++){
                                if(oushu==list.get(i)*list.get(j)){
                                        result.add(list.get(i));
                                        result.add(list.get(j));
                                }
                        }
                       
                }
                return result;
        }

}

作者: crxc3237    时间: 2016-8-26 10:33
编程要是能解决,哥德巴赫猜想不就证明出来了,实际上只能无限的穷举而得不到反例
作者: 阿卜    时间: 2016-8-26 12:43
不能证明总是,但是可以把你输入的整数的两个质数和的情况试出来。有需要可以自行将int i改为键盘录入。

[Java] 纯文本查看 复制代码
public class Practice {
        public static void main(String[] args) {
                int i = 80;
num1:        for(int num1 = 1;num1 < i;num1++) {                //num1从1到i
                        if(num1 >= 4)                                        {
                                for(int x = 2;x <= num1 / 2; x++) {        //判断num1是否为质数
                                        if(num1 % x == 0) {
                                                continue num1;                                //num1不是质数,跳到下一个num1;
                                        }
                                }
                        }
num2:                for(int num2 = 1;num2 < i;num2++) {        //num2从1到i
                                if(num2 >= 4) {
                                        for(int x = 2;x <= num2 / 2; x++) {//判断num2是否为质数
                                                if(num2 % x == 0) {
                                                        continue num2;                                        //num2不是质数,跳到下一个num2;
                                                }
                                        }
                                }
                                if(num1 + num2 == i) {                        //num1与num2之和为i,就输出
                                        System.out.println(i + "=" + num1 + " + " + num2);
                                }
                        }
                }
        }
}

作者: 小蔡@¥¥¥    时间: 2016-8-26 21:47
坚持努力wbj 发表于 2016-8-26 09:56
好像不是所有的偶数都可以啊[mw_shl_code=java,true]import java.util.ArrayList;
import java.util.List;
...

这个题目就是哥德巴赫猜想???历史性难题!!!
作者: 小蔡@¥¥¥    时间: 2016-8-26 21:49
存在即合理。。。曾经的班主任说!
作者: 坚持努力wbj    时间: 2016-8-27 07:08
小蔡@¥¥¥ 发表于 2016-8-26 21:47
这个题目就是哥德巴赫猜想???历史性难题!!!

不知道,离开学校太久了,哥德巴赫猜想是什么都忘了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2