我的第一个程序:Java筛法求质数

来源:互联网 发布:库里15-16赛季数据统计 编辑:程序博客网 时间:2024/05/01 01:56

自己编的第一个程序啊,不是照着书敲代码。

正在看Java语言程序设计基础篇,有一个帖子说陈景润其实没有证明“1+2”,百度,哥德巴赫猜想百科里有筛法求质数,看到后很有感觉,书上的求质数是直接判断每一个数,算法不够好,我想编一个筛法的,不知道会不会好一些。于是边学边写。。。。。。

 

成功了,很高兴,但是不知道是电脑的问题,还是算法本身就好的不明显,或者是我对它期望太高,等等,总之没感觉特别快。

 

代码附上,将来看一看,肯定觉得很傻。

 

package aa;
import javax.swing.JOptionPane;
import java.lang.Math;;

public class PrimeNumber {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
//  输入指数对话框
  String input = JOptionPane.showInputDialog(null,
    "请输入指数:","求10的多少次方以内的质数?",
    JOptionPane.QUESTION_MESSAGE);
  long exponent = Integer.parseInt(input);
  
//  是否只显示个数对话框
  Object[] possibleValues = { "只显示个数", "显示所有结果"};
  Object selectedValue = JOptionPane.showInputDialog(null,
  "请选择", "是否只显示个数?",
  JOptionPane.INFORMATION_MESSAGE, null,
  possibleValues, possibleValues[0]);
  
//  计时开始
  long startTime = System.nanoTime();
  
//  数组用于存储结果
  long[] myList={2};
  
 outer:
  for(long i = 3; i < Math.pow(10,exponent); i++){
  inner: 
//   如果能被已有素数整除,则不是素数
   for(long value:myList){
    if(i%value == 0)
    continue outer;
   }
//  将新判断的素数加到数组末尾 
  long[] targetList = new long[myList.length + 1]; 
   System.arraycopy(myList, 0, targetList, 0, myList.length);
   targetList[myList.length] = i;
   myList = targetList;
  }
//  加空格,调整输出格式
  int row = 30;//每行显示30个
  String result = " ";
  for(int i = 0;i < myList.length;i++){
   result += myList[i];
   result += ((i + 1) % row == 0)?"/n":"  ";
  }
//  计时结束
  double estimatedTime = System.nanoTime() - startTime;
  
  String see;
  if(selectedValue == "只显示个数")
   see = "经过" + estimatedTime/1000000000 +
   "秒计算出有" + myList.length + "个:/n";
  else
   see = "经过" + estimatedTime/1000000000 +
   "秒计算出有" + myList.length + "个:/n"+result ;
  
//  输出结果  
  JOptionPane.showMessageDialog(null,see,
   "10的" + exponent + "次方以内的质数", 
   JOptionPane.INFORMATION_MESSAGE);
 }

}