1

我正在尝试制作一个 void 方法,可以打印素数到给定的 int 参数。这就是我所拥有的,但它不起作用。

public class listPrimes {
    public static void main(String[] args) {
        printPrimes(1000);

    }

static void printPrimes(int max) {
    int counter = 0;
    for (int i = 2; i <= max; i++) {
        for (int n = 2; n < i; n++) {
            if (i % n == 0) {
                counter++;
            }
        }
        if (counter == 0) {
            System.out.println(i);
            counter = 0;
        }
    }
}
}

我能够使用以下两种方法创建所需的效果,但我想用一种方法来实现。我上面的代码有什么问题?

public class listPrimes {
    public static void main(String[] args) {
        printPrimes(1000);
    }

private static void printPrimes(int max) {
    for (int i = 2; i <= max; i++) {
        if (primeCheck(i)) {
            System.out.println(i);
        }
    }
}

static boolean isPrime(int check) {
    for (int i = 2; i < check/2; i++) {
        if (check % i == 0) {
            return false;
        }
    }
    return true;
}
}
4

8 回答 8

6

您永远不会重置counter. outer loop因此,一旦增加,它就永远不会为 0。所以,只需counter在外循环开始处重置:-

for (int i = 2; i <= max; i++) {
    counter = 0;
    for (int n = 2; n < i; n++) {
        if (i % n == 0) {
            counter++;
        }
    }
    if (counter == 0) {
        System.out.println(i);
    }
}

但是,我更喜欢第二种方式,因为它以不同的方法划分任务。因此,这两种方法都有其定义的角色。您可以轻松地在其他地方使用它们。请记住,您在不同方法之间划分任务越多,您获得的可重用性就越高。让一种方法只完成一项任务总是更好。

另外,我建议将方法重命名为 - primeCheckisPrime因为它正在返回一个boolean值。所以,只要遵循命名约定,isPrime就会是一个好名字。

于 2013-02-07T21:31:49.230 回答
3

一种变体,以获得更好的性能:

public static void main(String[] args) {
    printPrimes(100);
}

public static void printPrimes(int range) {
    for (int iCounter=1; iCounter<=range; ++iCounter) {
        if (iCounter <= 1) continue;
        if (iCounter == 2 || iCounter == 3) {
            System.out.println(iCounter);
            continue;
        }
        if (iCounter%2 == 0) continue;
        int iCounterSqrt = (int) Math.sqrt(iCounter);

        boolean bPrime = true;
        for (int iDenom=3; iDenom <= iCounterSqrt; iDenom += 2) {
            if (iCounter % iDenom == 0)
                bPrime = false;
        }

        if (bPrime) {
            System.out.println(iCounter);
        }
    }
}
于 2013-02-07T22:12:24.407 回答
0
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package javaapplication4;

/**
 *
 * @author sahadev & vignesh
 */
 class primecollection {


    public static void main(String[] args) {
     int r,s=0,k=0;
      int i,j;
      int a[] = new int[50];
      for(i=2;k<10;i++)
      {
        for(j=1;j<=i;j++)
        {
         r = i%j;

         if(r==0)
         {
          s++;
         }
         if(s==2)
         {
           a[k] = i; 
           k++;
         }
        }
        System.out.println(a[k]);
    }

}
}
于 2013-12-14T08:30:40.940 回答
0

如果您使用大量数据对此进行测试,则使用 SQRT 会更有效。 http://www.wikihow.com/Check-if-a-Number-Is-Prime

    Scanner reader = new Scanner(System.in);
    System.out.println("Enter the a number");
    int num = reader.nextInt();
    int counter = 0;
    int root = 0;
    boolean prime_flag;

    if (2 <= num) {
        // 2 is the only even prime number
        counter++;
    }

    for (int i = 3; i < (num + 1); i++) {

        // test only for odd number
        if (i % 2 != 0) {
            prime_flag = true;
            root = (int) (Math.sqrt(i) + 1);

            for (int j = 3; j < (root + 1); j++) {
                if ((i % j == 0) && (i != j)) {

                    prime_flag = false;
                    break;
                }
            }

            if (prime_flag) {
                counter++;
            }

        }

    }

    System.out.println("Count of prime numbers upto " + num + " is "
            + counter);
于 2015-03-10T17:36:29.103 回答
0

这是在Javascript中获取素数直到'n'的代码。这是一个优化的代码,你可以相应地重构你的代码。基本逻辑:对于每个数字,我检查它是否可以被我们已经找到的任何素数整除,直到它小于或等于 i/2。

function getPrimesTill(n){
  var i, j, len, limit, result = [];
  for(i=2;i<n;i++){
      limit = i/2;
      len = result.length;
      isPrime = true;
      for(j=0;len && result[j]<=limit;j++){
          if(i%result[j] == 0){
              isPrime = false;
              break;
          }
      }
      if(isPrime) result.push(i);
  }
  return result;
}
getPrimesTill(100);
于 2015-10-21T07:23:37.433 回答
0

您可以按照以下步骤减少计算机查找质数的时间!

  • 您只需要检查新数字是否可以被前素数整除
  • 您只需执行此操作直至所检查数字的平方根
  • 你只需要检查一个数字,如果它是一个公正的数字

所以我会这样做:

public static void searchPrimes() {

    List<Long> primes = new ArrayList<Long>();

    System.out.println(2);

    loop:
    for(long x = 3; x < 100; x += 2) {

        int y = 0;

        while(primes.get(y) < Math.sqrt(x)) {

            if(x % primes.get(y) == 0) {

                continue loop;
            }

            y++;
        }

        primes.add(x);
        System.out.println(x);
    }
}

这是我找到的最干净、最快的方法!

于 2018-03-12T16:02:18.183 回答
0

最简单的方法。

private static void nPrimeNumber(int n) {
    boolean result = true;
    for (int i = 2; i <= n; i++) {
        result = true;
        for (int j = 2; j < i; j++) {
            if (i % j == 0 ) {
                result = false;
                break;
            }
        }
        if(result){
            System.out.print(i+" ");
        }
    }
}
于 2019-07-03T10:45:40.530 回答
-1
public class listPrimes {
public static void main(String[] args) {
    printPrimes(1000);

}

static void printPrimes(int max) 
{

    for(int k=2;k<=max;k++)
    { 
        int counter=0;
        for(int i=1;i<=k;i++)
        {
            if((k%i)==0)
            {
                counter++;
            }
        }
        if(counter==2)
        {
            System.out.println(k+"is prime");
        }
    }
}

}

于 2014-08-26T10:05:28.500 回答