黑马程序员技术交流社区
标题:
歌德巴赫猜想,任何一个大于六的偶数可以拆分成两个质数...
[打印本页]
作者:
王小丑
时间:
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 编辑
import java.util.*;
public class 歌德巴赫猜想 {
public static void main(String[] args) {
while(true){
show();
}
}
//输入目标数
public static int diguiInput(){
System.out.println("输入一个大于6的偶数");
int num=new Scanner(System.in).nextInt();
if(num>6){
if(num%2==0){
System.out.println("正确,你输入的数是"+num+"即将为你算");
return num;
}
else{
System.out.println("错误,你输入的数是"+num+"请重新输入");
num=diguiInput();
}
}
else{
System.out.println("错误,你输入的数是"+num+",请重新输入");
num=diguiInput();
}
return num;
}
//建立3到给定数之间的质数表
public static int[] zhishuArray(int num){
//遍历可能的质数
int[] arr=new int[num];
//保存质数
int[] brr=new int[num];
int count=0;
//算3到你给出的数之间的质数
for(int x=3;x<arr.length;x++){
for(int y=2;y<arr.length;y++){
if(x==y){
brr[count]=x;
count++;
}
if(x%y==0){
break;
}
}
}
return brr;
}
public static int[][] combot(int[] arr,int num){
int no1;
//int[] brr=new int[2];
int sum=num;
//临时创建一个二维数组存各种组合
int[][] crr=new int[num][2];
//记录二维数组角标
int count=0;
for(int x=0;x<arr.length/2;x++){
sum=num-arr[x];
no1=arr[x];
if(arr[x]>num/2){
break;
}
for(int y=0;y<arr.length;y++){
if(sum==arr[y]){
//brr[0]=no1;
//brr[1]=arr[y];
crr[count]=new int[]{no1,arr[y]};
count++;
}
}
}
//把临时的二维数组压缩成新的二维数组,不然输太大的数,占内存
int[][] drr=new int[count][2];
for(int x=0;x<drr.length;x++){
drr[x][0]=crr[x][0];
drr[x][1]=crr[x][1];
}
return drr;
}
public static void show(){
int num=diguiInput();
int[][] arr=combot(zhishuArray(num),num);
for(int x=0;x<arr.length;x++){
//if(arr[x][0]!=0|arr[x][1]!=0){
System.out.println(num+"拆分的质数是"+arr[x][0]+"和"+arr[x][1]);
}
}
}
复制代码
写了N个小时终于写完了,但是发现自己写了很多,不过功能总算实现了,打印所有组合。调式了N多次~~而且写完这个,好好研究下数组在内存的关系。{:soso_e130:}
作者:
肖亚光
时间:
2013-1-29 18:03
import java.util.*;
class Gedebahe
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个大于6的偶数");
int num = sc.nextInt();
while(num<=6||num%2!=0)
{
System.out.println("输入错误,请重新输入");
num = sc.nextInt();
}
for(int i = 3;i<num/2;)
{
if(!isZhishu(i)&&!isZhishu(num-i))
{
System.out.println(num+"="+i+"+"+(num-i));
}
i = i+2;
}
}
public static boolean isZhishu(int num)
{
boolean flag = false;
for(int i =2 ;i<num/2;i++)
{
if(num%i==0)
{flag=true;break;}
else
flag=false;
}
return flag;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2