繁体   English   中英

Java - 提高简单质数验证器的性能

[英]Java - Increasing performance of a simple prime number validator

我正在介绍Java类,刚刚完成了一项任务,但我脑子里还有一个问题。 我没有时间问我的教授,这与我们正在做的事情有点不同。

基本上我们有一个程序将验证用户输入的整数是否为素数。 如果它不是素数,它计算最小的素数小于输入。 例如:

Enter an integer: 4
4 is not a prime number. The closest prime number is 3.

如果输入不是素数,则程序使用循环按预期工作。 这是我的代码:

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    int number;

    System.out.print("Please enter a positive, non-zero integer: ");
    number = input.nextInt();
    input.close();

    if (isValid(number) == true) {
        if(isPrime(number) == true) {
            System.out.printf("%d is a prime number.", number);
        } else {
            switch(number) {
                case 1: 
                    System.out.print("1 is not a prime number. \n");
                    System.out.print("We cannot find the nearest prime.");
                    break;
                default:
                    System.out.printf("%d is not a prime number.", number);
                    System.out.printf("\nThe nearest prime number is %d.", getNearestPrime(number));
                }
            }
        } else {
        System.out.print("Invalid input. Please run again.");
        System.exit(1);
    }   
}

public static boolean isValid(int number) {

    if (number > 0) {
        return true;
    } else {
        return false;
    }
}

public static boolean isPrime(int number) {

    int i;
    if(number == 1) {
        return false;
    } else {
        for(i = 2; i < number; i++) {
            if(number%i == 0) {
                return false;
            }
        }
        return true;
    }
}

public static int getNearestPrime(int number) {

    do {
        number--;
    } while (isPrime(number) == false);

    return number;
}

重要的是要注意我们需要创建下面列出的三种方法main。

我的问题是: 在这种情况下计算更大的整数时有没有办法提高性能?

如果我要输入2,147,483,647,该程序大约需要10秒钟来识别它的素数。 如果我输入2,147,483,646,找到最接近的素数大致需要相同的时间。

我完全理解为什么会发生这种情况,但似乎我使用过的任何高级Java应用程序都可以比简单的程序更快地计算机。

我真的很好奇有经验的程序员如何处理这样的事情。 谢谢!

你可以改变一些简单的事情:

1)素数永远不会是偶数,所以一旦你检查一个数字是否可以被2整除,你就不需要检查它是否可以被任何其他偶数整除。 所以你可以简化一下你的循环。 (刚加入的if检查语句,如果数字是2 ,然后开始i的三个)

2)你只需循环直到数字的平方根。

  int i;
  if(number == 1) {
      return false;
  }
  if(number == 2) {
     return true; //2 is a prime number
  } 
  if (number % 2 == 0) {
     return false;
  }
  for(i = 3; i* i <= number; i+=2) {
      if(number%i == 0) {
          return false;
      }
  }
  return true;

有一点需要注意的是算法明智地使用更有效的算法。 有关详情,请参阅此答案

关于实现,您可以使用一些技巧,例如,如果您想提高性能,请缓存最近的结果。 一种更有效的方法,但也许在课程范围之外,可以使用预先计算的素数列表。 您可以在互联网上找到一个,或者您可以运行一次程序,以便将它们预先计算到给定点。

请注意,为了速度,这种方法会牺牲一些内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM