鄙人不才,接触java也有一段时间了,之前开始学循环的时候,看到一个问题,问如何用java验证歌德巴赫猜想,当时并不是很能顺利的想到解决方案,而当在对算法思想理解深入之后,才有了一个初步思路。
在此,先介绍一下歌德巴赫猜想问题。歌德巴赫猜想,就是验证所有不小于2的偶数都可写作两个质数之和,比如16,可写作:
16 = 13 + 3;
又比如24,可写作:
24 = 7 + 17;
由于数学界至今未有通解,我们也只能用计算机验证一定数量的偶数是否满足要求。
我们要验证的话,只要获取偶数列表及对应的质数列表,然后验证列表中的偶数是否能写作质数列表中两个数之和即可。
首先,我们获取质数列表:
然后获取满足要求的偶数列表://验证一定数量级的歌德巴赫猜想 int line = 1000;//确定需要的最大数字 List nums_list = new ArrayList();//建立list存储质数 for(int i=2;i<line+1;i++) { boolean flag = true; for(int j = 2;j<i;j++) { if(i%j==0) {//如果i能被j整除,则跳出循环,并将flag变为非,不存入列表 flag = false; break; } } if(flag) {//满足要求则存入列表 nums_list.add(i); } } //System.out.println(nums_list);
List sec_list = new ArrayList();//建立偶数列表,来存储满足条件的偶数
for(int n=2;n<line+2;n=n+2){//验证
for(int k=1;k<n;k++) {
if(nums_list.contains(k)&&nums_list.contains(n-k)) {
//如果k和n-k都在质数列表中,则认为该偶数满足要求,然后加入偶数列表
sec_list.add(n);
break;
}
}
}
//System.out.println(sec_list);
最后遍历偶数列表,如果有不在列表中的偶数,则输出:
boolean h = true;
for(int o=4;o<line+1;o=o+2){
//遍历偶数列表,如果有漏网之鱼,则打印出来
if(sec_list.contains(o)) {
continue;
}else {//如果有不存在列表中的偶数,则输出错误
h = false;
System.out.println("有无法验证的偶数:"+o);
System.out.println("错误");
break;
}
}
if(h) {
System.out.println("验证"+line+"以内的歌德巴赫猜想成功");
}
由于这种方法不好验证2,所以我们认为2就是符合要求的,因为2=1+1;
同时,亦可用Python来验证歌德巴赫猜想,由于Python遍历简单,所以看上去更简洁:
#验证一定数量级的歌德巴赫猜想
line = 1000#确定要验证的范围
nums = []#存储质数
nums1 = []#存储偶数
i=2
for i in range(2,line):#第一步获取一定数量的质数列表
j=2
for j in range(2,i):
if(i%j==0):
break
else:
nums.append(i)
for num in range(2,line,2):#第二步,如果有偶数可以写成两个质数之和,则加入列表
for a in range(1,num,1):
if a in nums and (num-a) in nums:
nums1.append(num)
break
for n in range(4,line,2):#遍利偶数列表,如果有其中不存在的偶数,则打印出来
if n not in nums1:
pass#为了保持程序结构,空语句,不做任何操作
print n
print nums1#打印满足要求的偶数列表
本人接触编程时间不长,若文章有何错误,望指正