当我输入某些nthprime数字时,我不知道为什么我的代码无法正常工作。我试图改变我的代码几次但是对于每一个nthprime我都让它工作,我让其他人变得更糟。因此,如果我更改我的代码以使其适用于nthprime = 8,我意识到nthprime = 7并且其他一些人停止工作。任何人都可以指出我所做的具体缺陷,或者我应该重新考虑我的代码大纲。谢谢。
public class NthPrime {
public static void main(String[] args) {
int nthprime;
System.out.println("Enter value for n:");
nthprime=IO.readInt();
while(nthprime <= 0){
System.out.println("Enter a positive value for n");
nthprime=IO.readInt();
}
if(nthprime == 1){
System.out.println("The nth prime number is: "+2);
}
if(nthprime == 2){
System.out.println("The nth prime number is: "+3);
}
if(nthprime > 2){
int prime=2;
int num=3;
int square;
boolean nonprime=false;
while(prime < nthprime){
prime++;
num+=2;
square = (int) Math.sqrt(num);
for (int i=3; i <= square; i++){
if (num % i == 0){
nonprime=true;
num+=2;
}
if(nonprime==false){
prime++;
num+=2;
}
}
}
System.out.println("The nth prime number is: "+num);
}
}
}
答案 0 :(得分:1)
检查此循环:
for (int i=3; i <= square; i++){
if (num % i == 0){
num+=2;
}
else {
prime++;
num+=2;
}
}
您似乎希望遍历所有奇数到您号码的平方根。如果其中一个分裂,那么它应该停止循环并将其标记为非素数。如果它没有划分任何数字,你应该将它标记为素数,但即使这应该在循环完成后完成。 (例如,当我&gt; square)
我不想给你答案,因为看起来你想要自己修复你现有的循环。但是一种策略是将它标记为非素数(在布尔值中),然后在循环之后,检查布尔值并增加素数(prime ++),如果布尔值表示它是素数。请记住重新初始化布尔值,以便在下次到达for循环时正确设置它。
答案 1 :(得分:0)
创建另一种方法来检查数字是否为素数,并使用while循环来获取素数。
public static void main(String[] args) {
...
if (nthprime == 1) {
System.out.println("The nth prime number is: 2");
} else {
int num = 3;
for (int i = 2; i <= nthPrime; i++) {
while(!isPrime(num)) {
num += 2;
}
num += 2;
}
System.out.println("The nth prime number is: "+ (num - 2));
}
}
private static boolean isPrime(int n) {
int sqrt = (int) Math.sqrt(n);
for (int i = 2; i <= sqrt; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
答案 2 :(得分:0)
import java.util.Scanner;
public class NewNthPrime {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
for(int a0 = 0; a0 < t; a0++){
boolean flag = false;
int n = in.nextInt();
int[] prime = new int[n];
prime[0] = 2;
int i = 3,j=1;
while(j<n){
for(int y=0;y<prime.length;y++){
if(prime[y]==0){
break;
}
else if (i%prime[y]==0){
flag = true;
break;
}
}
if(!flag){
prime[j++]=i;
}
flag =false;
i+=2;
}
System.out.println(prime[n-1]);
}
}
}
在这里,我声明了一个名为prime的数组,该数组存储所有素数。 while循环部分检查存储在array-prime []中的质数是否除以数字'i'(仅是奇数)。如果确实如此,则标志变为true,我们跳过下一个数字“ i”。在这里,当我还检查数组内的数字是否为零时,它会中断for循环,因为在素数数组中不能再有素数了。 现在,如果数字'i'不能被数组中的任何素数整除,则'flag'仍然为false,'i'放在数组prime []中。