首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >首n素数优化

首n素数优化
EN

Code Review用户
提问于 2016-08-05 17:48:43
回答 2查看 556关注 0票数 3

相当标准的。生成第一个n素数,通过扫描器输入。

代码语言:javascript
运行
复制
package main;

import java.util.Scanner;

public class Prime_Generator {
   public static void main(String args[]) {
      int n;
      int status = 1;
      int num = 3;

      Scanner scanner = new Scanner(System.in);
      System.out.print("First n primes: ");

      n = scanner.nextInt();
      if (n >= 1) {
         System.out.print("First "+n+" prime numbers are: \n");
         System.out.println(2);
      }

      for (int i = 2; i <=n;) {
         for (int j = 2; j <= Math.sqrt(num); j++) {
            if (num%j == 0) {
               status = 0;
               break;
            }
         }
         if (status != 0) {
            System.out.println(num);
            i++;
         }
         status = 1;
         num++;
      }         
   }
}

我的问题是:

  • 如何提高代码的效率?
EN

回答 2

Code Review用户

发布于 2016-08-05 21:01:57

有两件事:

首先,您注意到,如果我输入"1“作为输入,我将得到"2”而不是"2“。

其次,检查数字n与从2到sqrt(n)之间的所有数字的可分性。这很好,但是你可以通过跟踪你产生的所有素数来改进它。每当您发现p是素数时,就将它添加到素数列表中,称为primeList。现在,当您想要检查n是否为素数时,可以对primeList中sqrt小于或等于n的所有素数进行测试,这样可以保存要测试的素数。

关于寻找质数有很多先进的理论,但对于简单的理论来说,这就足够了。

票数 2
EN

Code Review用户

发布于 2016-08-05 20:40:25

  • 首先:我猜int num = 3;正在测试您忘记删除的代码吗?Math.sqrt(num)应该是Math.sqrt(i)
  • 为了提高效率:保留一个数组,或者一个包含非素数列表的hashmap,如果它们在列表中,则在第二个循环中跳过check if ( num%j == 0 )。如果您使用hashmap,这是O(1)时间,所以我会这样做。另外,请参阅埃拉托斯提尼筛
  • 为了不打印最后一个逗号,如果您不想一找到数字就不打印它,只需保留一个数组results,在这里按下素数,然后用String.join(",", results);打印它们。或者,看看这个问题
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/137941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档