题目背景
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。需要特别说明的是1不是质数。
这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。
从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。
题目描述
现在请你编一个程序验证哥德巴赫猜想。
先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数。
输入输出格式
输入格式:
仅有一行,包含一个正奇数n,其中9<n<20000
输出格式:
仅有一行,输出3个质数,这3个质数之和等于输入的奇数。相邻两个质数之间用一个空格隔开,最后一个质数后面没有空格。如果表示方法不唯一,请输出第一个质数最小的方案,如果第一个质数最小的方案不唯一,请输出第一个质数最小的同时,第二个质数最小的方案。
输入输出样例
输入样例#1: 复制
2009
输出样例#1: 复制
3 3 2003
在此题中刚开始时用了list数组,然后由于自己的求素数失误,改成了arrays数组,
经过复杂度的判断,发现把质数求出来,然后进行处理,是可行的,所以先将质数求出来存入数组。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] list =new int[20000];
list[0]=2;
int count=1;
for(int i=3;i<=20000;i++) {
int flag=1;
for(int j=2;j<=Math.sqrt(i);j++) {
if(i%j==0) {
flag=0;
break;
}
}
if(flag==1) {
list[count]=i;
count++;
}
}
for(int i=0;i<count;i++) {
int flag=1;
for(int j=0;j<count;j++) {
int f=n-list[i]-list[j];
for(int k=0;k<count;k++) {
if(list[k]==f) {
System.out.println(list[i]+" "+list[j]+" "+f);
flag=0;
break;
}
}
if(flag==0)
break;
}
if(flag==0)
break;
}
}
}
失误点:Arrays中的二分查找方法,运用不熟练,可以说是不会用QWQ,其次一些简单的算法没有彻底掌握;