我写了一些代码来查找给定数字的素数。你能让我知道如何让我的代码更高效或更好吗?或者深入了解我的表现?另外,我的代码中存在一个问题,其中某些数字在模式中重复两次或三次。我该如何解决这个问题?
public class PrimeNumber2 {
public static void main(String[] args)
{
int max_prime = 10000;
for(int i = 3; i < max_prime; i+=2)
{
for(int j = 1; j < Math.sqrt(i); j++)
{
if(i % j == 0)
{
System.out.println(i);
}
}
}
}
}
答案 0 :(得分:2)
看看: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
这是一个很好的方式。
以下是一些代码供您查看:
public void runEratosthenesSieve(int upperBound) {
int upperBoundSquareRoot = (int) Math.sqrt(upperBound);
boolean[] isComposite = new boolean[upperBound + 1];
for (int m = 2; m <= upperBoundSquareRoot; m++) {
if (!isComposite[m]) {
System.out.print(m + " ");
for (int k = m * m; k <= upperBound; k += m)
isComposite[k] = true;
}
}
for (int m = upperBoundSquareRoot; m <= upperBound; m++) {
if (!isComposite[m]) {
System.out.print(m + " ");
}
}
答案 1 :(得分:1)
这是你的调整版。
我确实将检查数字是否是一个单独的方法。这也是你的版本多次打印值的部分原因,因为如果它发现它有一个除数,那么它会打印这些值。 (同样,你的algorythm会打印基本的所有东西,尽管它是否为素数,例如它打印15和27)。
它确实打印多个值的原因是,一旦你找到了一个除数,它就会打印i
,但它会继续循环。如果它会找到另一个除数,它会再次打印i
(您可以注意到它不仅打印素数)。
这是你的
的固定版本public static void main(String[] args) {
if(isPrime(2)) {
System.out.println(2);
}
int max_prime = 10000;
for(int i = 3; i < max_prime; i+=2)
{
if(isPrime(i)) {
System.out.println(i);
}
}
}
private static boolean isPrime(int n) {
if(n<=1) return false;
if(n == 2) return true;
for(int i = 2;i*i<=n;++i) {
if(n%i == 0) return false;
}
return true;
}
答案 2 :(得分:1)
试试这个。
public class PrimeNumber2 {
public static void main(String[] args)
{
int max_prime = 10000;
System.out.println(2);
L: for (int i = 3; i < max_prime; i += 2)
{
for (int j = 3, max = (int)Math.sqrt(i); j <= max ; j += 2)
{
if(i % j == 0)
{
continue L;
}
}
System.out.println(i);
}
}
}
答案 3 :(得分:1)
这是使用parallelStream的方法
System.out.println(2);
IntStream.range(1, 10000000)
.map(i -> i * 2 + 1)
.filter(i -> (i & 1) != 0 && IntStream.range(1, (int) (Math.sqrt(i)-1)/2)
.map(j -> j * 2 + 1)
.noneMatching(j -> i % j == 0)
.forEach(System.out::println);
注意:范围测试第n个奇数。
答案 4 :(得分:0)
public static void main(String[] args) {
int upperBound = 30;
List<Integer> primes = new ArrayList<>();
// loop through the numbers one by one
for (int number = 2; number < upperBound; number++) {
boolean isPrimeNumber = true;
// check to see if the number is prime
for (int j = 2; j < number; j++) {
if (number % j == 0) {
isPrimeNumber = false;
break; // exit the inner for loop
}
}
// print the number if prime
if (isPrimeNumber) {
primes.add(number);
}
}
System.out.println("The number of prime is: " + primes.size() + ", and they are: " + primes.toString());
}
可能会重复
答案 5 :(得分:-1)
public boolean isPrimeNumber(int number) {
for (int i=2; i<=number/2; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}