Java-素数算法实现&x27;行不通

Java-素数算法实现&x27;行不通,java,primes,Java,Primes,我写了这段代码,用来搜索素数并将它们放入一个数组中。这是: int[] prime_array = new int[(int)s.upper_bound]; int index_in_array = 0; boolean are_we_done = false; int index = 1; boolean is_prime = true; while (!are_we_done) { try { for (int i = 1; i < index; i++) {

我写了这段代码,用来搜索素数并将它们放入一个数组中。这是:

int[] prime_array = new int[(int)s.upper_bound];
int index_in_array = 0;
boolean are_we_done = false;
int index = 1;
boolean is_prime = true;

while (!are_we_done) {
    try {
        for (int i = 1; i < index; i++) {
            if ((index%i)==0) {
                is_prime = false;
            }
        }

        if (is_prime) {
            prime_array[index_in_array] = index;
            index_in_array++;
        }

        index++;
        is_prime = true;
    } 
    catch (IndexOutOfBoundsException e) {
        are_we_done = true;
        break;
    }
}
int[]素数数组=新的int[(int)s.上界];
数组中的int索引=0;
布尔值are_we_done=false;
int指数=1;
布尔值为_素数=真;
而(!我们完成了吗){
试一试{
对于(int i=1;i

不幸的是,它捕获的唯一素数是1。知道它为什么不起作用吗?

您的
for
循环正在查找以
i=1
开始的因子,如果
索引%i==0
,则确定它不是素数。但是所有整数的
n%1==0

表示某事物不是素数的最低因子是
2

编辑:

以下是一些其他建议:

  • 使用一个适当有界的循环遍历候选素数
  • 仅检查候选素数的平方根以下的因子
  • 只检查2和奇数作为素数(因为2以上的偶数都不是素数,1是单位,不是素数)
  • 仅检查2和奇数作为因子(因为2以上的偶数不能作为素数因子)
  • 改用a

您的
for
循环正在查找以
i=1
开头的因子,如果
索引%i==0
,则确定它不是素数。但是所有整数的
n%1==0

表示某事物不是素数的最低因子是
2

编辑:

以下是一些其他建议:

  • 使用一个适当有界的循环遍历候选素数
  • 仅检查候选素数的平方根以下的因子
  • 只检查2和奇数作为素数(因为2以上的偶数都不是素数,1是单位,不是素数)
  • 仅检查2和奇数作为因子(因为2以上的偶数不能作为素数因子)
  • 改用a

您的标题表明该算法不好,但我认为您是指您自己的实现。@Dici为什么不?我听说过for循环,但我认为阅读这段代码更容易。@Dici为什么?在这种情况下,只能在数组已满时抛出
ArrayOutOfBoundException
。您可以很容易地检查填充数组的时刻,那么为什么要等待抛出异常并捕获它呢?您不能依靠编程错误退出循环!!另外,异常是慢的,慢的,慢的。你的标题暗示算法不好,但我想你是指你自己的实现。@Dici为什么不?我听说过for循环,但我认为阅读这段代码更容易。@Dici为什么?在这种情况下,只能在数组已满时抛出
ArrayOutOfBoundException
。您可以很容易地检查填充数组的时刻,那么为什么要等待抛出异常并捕获它呢?您不能依靠编程错误退出循环!!另外,异常是缓慢的,缓慢的,缓慢的。这不是唯一的问题。这并不能解决问题question@Dici我当然同意代码在很多其他方面都不好,但这正是OP所问的问题。@khelwood还有什么其他方面?@khelwood现在答案是完整的,+1。但是,它返回1作为素数,要修复它,请将
is_prime
初始化为false。@khelwood关于平方根的部分是正确的。然而,我不能使用for循环,因为我不知道需要多少素数。同样的原因也解释了为什么使用筛子效率不高。这不是唯一的问题。这并不能解决问题question@Dici我当然同意代码在很多其他方面都不好,但这正是OP所问的问题。@khelwood还有什么其他方面?@khelwood现在答案是完整的,+1。但是,它返回1作为素数,要修复它,请将
is_prime
初始化为false。@khelwood关于平方根的部分是正确的。然而,我不能使用for循环,因为我不知道需要多少素数。这也是为什么使用筛子效率不高的原因。