每个人!我有一个java应用程序,可以显示从2到给定数字的所有质数(用户输入).How我可以打印出给定范围内的最后一个数字吗,我是说最大的一个?例如:如果用户输入是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;
}
}
}
}
}我在考虑创建另一个整数数组,然后调用最后一个元素(这将是存储的最后一个数字),但我不知道怎么做。提前谢谢你!
发布于 2013-11-11 15:21:53
使用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);发布于 2013-11-11 15:30:35
由于这些数字是连续数字(从1到N),我们可以从最大的索引中检查素数标志(在您的代码中,它是boolean[] isPrime )。
如果它是真的,那么它的索引和1 (index+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));发布于 2013-11-11 16:17:10
与打印质数不同,您可以检查要打印的数字是否大于之前要打印的数字,如果它是质数或更大,则将该质数保存为到目前为止的最大值。一旦你完成了筛选过程,保存的素数应该就是你想要的了。
如下所示:
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);https://stackoverflow.com/questions/19900721
复制相似问题