Сито Java Eratostenes, печатающее только самое большое простое число с заданного потолка?
Все! У меня есть Java-приложение, которое показывает все простые числа от 2 до заданного числа (пользовательский ввод). Как я могу распечатать только последнее число, самое большое, которое я имею в виду, из заданного диапазона? Например: если пользовательский ввод равен 12, компилятор печатает только 11, а не 2,3,5,7,11. Вот код:
package sieve_eratos;
import java.util.Scanner;
public class Sieve_Eratos {
public static void main(String[] args) {
// get the ceiling on our prime numbers
int N;
Scanner sc = new Scanner(System.in);
System.out.print("enter the prime number ceiling: ");
N = sc.nextInt();
sc.close();
int k = 0;
// init numbers array, where true denotes primality
boolean[] isPrime = new boolean[N];
// init possible primes
isPrime[0] = false; // 1 is not prime
for (int i = 1; i < N; i++) {
isPrime[i] = true;
k = k + 1;
}
// check every number >= 2 for primality
for (int i = 2; i <= N; i++) {
// i is prime if it hasn't been "crossed off" yet
if (isPrime[i - 1]) {
// print out the prime number
System.out.println(i);
// "cross off" all the subsequent multiples of i
//for (int j = 2*i; j <= N; j += i) {
for (int j = i * i; j <= N; j += i) { // more efficient
isPrime[j - 1] = false;
}
}
}
}
}
Я думал о создании другого целочисленного массива и последующем вызове последнего элемента (который будет последним сохраненным числом), но я понятия не имею, как это сделать. Заранее спасибо!
3 ответа
Поскольку числа являются последовательными числами (от 1 до N), мы можем проверить флаги простых чисел (в вашем коде это boolean [] isPrime) по наибольшему индексу.
Если это правда, то сумма его индекса и 1 (индекс +1) будет простым потолком, который мы хотим.
Код выглядит следующим образом:
public static int populateCeilingPrime(boolean[] flags)
{
int len = flags.length;
for(int i= len -1;i>=0;i--)
{
if(flags[i])
{
return i+1;
}
}
return 0;
}
так что вам просто нужно вызвать этот метод выше, чтобы заполнить потолочное простое число, используя следующий код в конце метода main.
System.out.printf("The ceiling prime is %d ", populateCeilingPrime(isPrime));
Вместо того, чтобы печатать простое число, вы можете проверить, больше ли число, которое вы хотите напечатать, чем какое-то более раннее число, которое вы хотите напечатать, а затем, если оно простое и больше, вы сохраните это простое число как самое большое на данный момент. Как только вы закончите процесс просеивания, это сохраненное простое число должно быть тем, что вы хотите.
Вот так:
int maxPrime = 0;
for (int i = 2; i <= N; i++) {
// i is prime if it hasn't been "crossed off" yet
if (isPrime[i - 1]) {
if(i > maxPrime) {
maxPrime = i;
}
// "cross off" all the subsequent multiples of i
//for (int j = 2*i; j <= N; j += i) {
for (int j = i * i; j <= N; j += i) { // more efficient
isPrime[j - 1] = false;
}
}
}
System.out.println(maxPrime);
Используйте NavigableSet.lower. Взгляните на следующий пример
Integer primeValues[]={2,3,5,7,11};//Here store all primes
NavigableSet<Integer> primeCollec=new TreeSet<>();
primeCollec.addAll(Arrays.asList(primeValues));
//Add all range prime into NavigableSet
int input=12;// Get the user input here
int output=primeCollec.lower(input);// Here is the desired output based on input
System.out.println(output);