黑马程序员技术交流社区

标题: 歌德巴赫猜想,任何一个大于六的偶数可以拆分成两个质数... [打印本页]

作者: 王小丑    时间: 2013-1-28 19:02
标题: 歌德巴赫猜想,任何一个大于六的偶数可以拆分成两个质数...
本帖最后由 张向辉 于 2013-1-30 11:35 编辑

歌德巴赫猜想,任何一个大于六的偶数可以拆分成两个质数的和

要求:打印出所有的可能
参考答案如下,只是太麻烦了,求高手指教,给出一个简单的方法,最好能用递归实现!



//任何一个大于六的偶数可以拆分成两个质数的和

//打印出所有的可能

public class Gedebahe{

public static void main(String args[]){

int num = Integer.parseInt(args[0]);

if(num<=6){

System.out.println(“参数错误!”);

return;

}

if(num%2!=0){

System.out.println(“参数错误!”);

return;

}

Gedebahe g = new Gedebahe();

//1不是质数,2是偶数,因此从3开始循环

for(int i=3;i<=num/2;i++){

if(i%2==0){//如果为偶数,退出本次循环

continue;

}

//当i与num-i都为质数时,满足条件,打印

if(g.isPrime(i) && g.isPrime(num-i)){

System.out.println(i+” + “+(num-i)+” = “+num);

}

}

}


作者: 陈丽莉    时间: 2013-1-28 20:50
       我说个大致思路
       记得之前参加算法的比赛有过类似的题,因为要验证的数据很多,所以先创建一个数组,存起从3开始查找到的能存下的所有质数。然后验证一个大于六的偶数num时,双重循环,外循环a范围是从3到小于num的质数(从存好的数组里查找),内循环寻找num-a是否在数组中,当然限制是从外循环角标向后查找,直至找到或数组中的数已大于num-a。
        因为要验证的数据比较庞大,这种先存储再查找的方法可以极大地降低时间复杂度。
作者: 黄鸿达    时间: 2013-1-29 07:02
本帖最后由 jy00228875 于 2013-1-29 07:20 编辑
  1. import java.util.*;
  2. public class 歌德巴赫猜想 {

  3. public static void main(String[] args) {
  4. while(true){
  5. show();
  6. }

  7. }
  8. //输入目标数
  9. public static int diguiInput(){
  10. System.out.println("输入一个大于6的偶数");
  11. int num=new Scanner(System.in).nextInt();
  12. if(num>6){
  13. if(num%2==0){
  14. System.out.println("正确,你输入的数是"+num+"即将为你算");
  15. return num;
  16. }
  17. else{
  18. System.out.println("错误,你输入的数是"+num+"请重新输入");
  19. num=diguiInput();
  20. }
  21. }
  22. else{
  23. System.out.println("错误,你输入的数是"+num+",请重新输入");
  24. num=diguiInput();
  25. }
  26. return num;
  27. }
  28. //建立3到给定数之间的质数表
  29. public static int[] zhishuArray(int num){
  30. //遍历可能的质数

  31. int[] arr=new int[num];
  32. //保存质数
  33. int[] brr=new int[num];
  34. int count=0;
  35. //算3到你给出的数之间的质数
  36. for(int x=3;x<arr.length;x++){
  37. for(int y=2;y<arr.length;y++){
  38. if(x==y){
  39. brr[count]=x;
  40. count++;
  41. }
  42. if(x%y==0){
  43. break;
  44. }
  45. }
  46. }
  47. return brr;
  48. }

  49. public static int[][] combot(int[] arr,int num){
  50. int no1;
  51. //int[] brr=new int[2];
  52. int sum=num;
  53. //临时创建一个二维数组存各种组合
  54. int[][] crr=new int[num][2];
  55. //记录二维数组角标
  56. int count=0;
  57. for(int x=0;x<arr.length/2;x++){
  58. sum=num-arr[x];
  59. no1=arr[x];
  60. if(arr[x]>num/2){
  61. break;
  62. }
  63. for(int y=0;y<arr.length;y++){
  64. if(sum==arr[y]){
  65. //brr[0]=no1;
  66. //brr[1]=arr[y];
  67. crr[count]=new int[]{no1,arr[y]};
  68. count++;
  69. }
  70. }
  71. }
  72. //把临时的二维数组压缩成新的二维数组,不然输太大的数,占内存
  73. int[][] drr=new int[count][2];
  74. for(int x=0;x<drr.length;x++){
  75. drr[x][0]=crr[x][0];
  76. drr[x][1]=crr[x][1];
  77. }
  78. return drr;
  79. }



  80. public static void show(){
  81. int num=diguiInput();
  82. int[][] arr=combot(zhishuArray(num),num);
  83. for(int x=0;x<arr.length;x++){
  84. //if(arr[x][0]!=0|arr[x][1]!=0){
  85. System.out.println(num+"拆分的质数是"+arr[x][0]+"和"+arr[x][1]);
  86. }


  87. }
  88. }
复制代码
写了N个小时终于写完了,但是发现自己写了很多,不过功能总算实现了,打印所有组合。调式了N多次~~而且写完这个,好好研究下数组在内存的关系。{:soso_e130:}
作者: 肖亚光    时间: 2013-1-29 18:03
  1. import java.util.*;
  2. class Gedebahe
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Scanner sc = new Scanner(System.in);
  7.                 System.out.println("请输入一个大于6的偶数");
  8.                 int num = sc.nextInt();
  9.                 while(num<=6||num%2!=0)
  10.                 {
  11.                         System.out.println("输入错误,请重新输入");
  12.                         num = sc.nextInt();
  13.                 }
  14.                 for(int i = 3;i<num/2;)
  15.                 {
  16.                         if(!isZhishu(i)&&!isZhishu(num-i))
  17.                         {
  18.                                 System.out.println(num+"="+i+"+"+(num-i));
  19.                         }
  20.                         i = i+2;
  21.                 }
  22.         }
  23.         public static boolean isZhishu(int num)
  24.         {
  25.                 boolean flag = false;
  26.                 for(int i =2 ;i<num/2;i++)
  27.                 {
  28.                         if(num%i==0)
  29.                         {flag=true;break;}
  30.                         else
  31.                                 flag=false;
  32.                 }
  33.                 return flag;
  34.         }
  35. }
复制代码





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