质数计划不起作用
Prime Number Programme not working
我想创建一个程序来显示素数,其中素数的索引由用户输入。基本上第 n 个素数将显示在用户输入 n 的位置。但是该程序无法正常工作,我们将不胜感激任何帮助。代码写在下面,谁能告诉我它有什么问题吗?
import java.io.*;
public class Nth_Prime
{
public static void main()throws Exception
{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Which Prime number would you like to find?");
int n = Integer.parseInt(stdin.readLine());
int k = 0;
int counter = 1;
int num=0;
for(int i=3;i<100;i++)
{
k=0;
for(int j=2;j<i;j++)
{
if(i%j!=0)
{
k++;
}
}
if(k!=0)
{
num=i;
counter++;
}
if(counter==n)
{
System.out.println("The number is: "+num);
break;
}
}
}
}
为什么你的代码是错误的(给出错误的输出) :: 当 i
是 25
时,你的内部 for 循环将递增 k
当 j = 2, 3, 7 ...
和退出内部 for
循环后,您的 if
条件 if(k!=0)
检查,因此对于 25
您的 k
应该是在 22
附近的某处,所以你甚至将 25
算作素数(这是错误的)。
尝试这样做。我用 boolean flag
替换了你的变量 k
,每次 i%j == 0
时我都将其设置为 false
,即 j
除 i
(表示i
不是素数,因此不计算在内)。
for(int i=3;i<100;i++)
{
boolean flag = true;
for(int j=2;j<i;j++)
{
if(i%j==0)
{
flag = false;
break;
}
}
if(flag)
{
num=i;
counter++;
}
if(counter==n)
{
System.out.println("The number is: "+num);
break;
}
}
少量优化::
1) 您可以考虑将第二个 for
循环更改为 for(int j=2;j<Math.sqrt(i);j++)
,因为要检查主要条件,您不需要检查超出 sqrt(i)
,因为在那之后因素会重复。
2) 您应该考虑使用 Sieve of Eratosthenes 作为寻找素数的最佳方法。
我弄错了
import java.io.*;
public class Nth_Prime
{
public static void main()throws Exception
{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Which Prime number would you like to find?");
int n = Integer.parseInt(stdin.readLine());
int k = 0;
int checker = 0;
int counter = 1;
int num=0;
for(int i=3;;i++)
{
k=0;
checker=0;
for(int j=2;j<i;j++)
{
if(i%j==0)
{
checker++;
}
}
if(checker==0)
{
k++;
}
if(k!=0)
{
num=i;
counter++;
}
if(counter==n)
{
System.out.println("The number is: "+num);
break;
}
else
{
continue;
}
}
}
}
这是有效的,但感谢你们的帮助
试试这个方法:
int num, count, i;
num=1;
count=0;
while (count < nth){
num=num+1; //find the next prime number
for (i = 2; i <= num; i++){
if (num % i == 0) {
break; //prime not found
}
}
if ( i == num){
count = count+1; //prime found
}
}
System.out.println("The number is: "+num);
我更喜欢创建包含 prime value 和 prime value 索引的 HashMap,试试这个小应用程序:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
public class Nth_Prime {
static boolean checkPrime(int n)
{
for (int i=2;i<n;i++)
{
if(n%i==0)
return false;
}
return true;
}
static HashMap<Integer,Integer> map=new HashMap<Integer, Integer>();
public static void main(String[] args) throws Exception {
BufferedReader stdin = new BufferedReader(new InputStreamReader(
System.in));
map.put(1, 2);
System.out.println("Which Prime number would you like to find?");
while(true)
{
int n = Integer.parseInt(stdin.readLine());
if( n<0)
return;
if(map.containsKey(n))
{
System.out.println("The number is: " + map.get(n));
}
else
{
int size=map.size();
int lastKey=size;//(int) map.keySet().toArray()[size-1];
int lastValue=map.get(lastKey);
for (int i = lastValue; i < 1000; i++) {
if(checkPrime(i))
{
map.put(size, i);
size++;
if(map.containsKey(n))
{
System.out.println("The number is: " + map.get(n));
System.out.println("Which Prime number would you like to find?");
break;
}
}
}
}
}
}
}
我想创建一个程序来显示素数,其中素数的索引由用户输入。基本上第 n 个素数将显示在用户输入 n 的位置。但是该程序无法正常工作,我们将不胜感激任何帮助。代码写在下面,谁能告诉我它有什么问题吗?
import java.io.*;
public class Nth_Prime
{
public static void main()throws Exception
{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Which Prime number would you like to find?");
int n = Integer.parseInt(stdin.readLine());
int k = 0;
int counter = 1;
int num=0;
for(int i=3;i<100;i++)
{
k=0;
for(int j=2;j<i;j++)
{
if(i%j!=0)
{
k++;
}
}
if(k!=0)
{
num=i;
counter++;
}
if(counter==n)
{
System.out.println("The number is: "+num);
break;
}
}
}
}
为什么你的代码是错误的(给出错误的输出) :: 当 i
是 25
时,你的内部 for 循环将递增 k
当 j = 2, 3, 7 ...
和退出内部 for
循环后,您的 if
条件 if(k!=0)
检查,因此对于 25
您的 k
应该是在 22
附近的某处,所以你甚至将 25
算作素数(这是错误的)。
尝试这样做。我用 boolean flag
替换了你的变量 k
,每次 i%j == 0
时我都将其设置为 false
,即 j
除 i
(表示i
不是素数,因此不计算在内)。
for(int i=3;i<100;i++)
{
boolean flag = true;
for(int j=2;j<i;j++)
{
if(i%j==0)
{
flag = false;
break;
}
}
if(flag)
{
num=i;
counter++;
}
if(counter==n)
{
System.out.println("The number is: "+num);
break;
}
}
少量优化::
1) 您可以考虑将第二个 for
循环更改为 for(int j=2;j<Math.sqrt(i);j++)
,因为要检查主要条件,您不需要检查超出 sqrt(i)
,因为在那之后因素会重复。
2) 您应该考虑使用 Sieve of Eratosthenes 作为寻找素数的最佳方法。
我弄错了
import java.io.*;
public class Nth_Prime
{
public static void main()throws Exception
{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Which Prime number would you like to find?");
int n = Integer.parseInt(stdin.readLine());
int k = 0;
int checker = 0;
int counter = 1;
int num=0;
for(int i=3;;i++)
{
k=0;
checker=0;
for(int j=2;j<i;j++)
{
if(i%j==0)
{
checker++;
}
}
if(checker==0)
{
k++;
}
if(k!=0)
{
num=i;
counter++;
}
if(counter==n)
{
System.out.println("The number is: "+num);
break;
}
else
{
continue;
}
}
}
}
这是有效的,但感谢你们的帮助
试试这个方法:
int num, count, i;
num=1;
count=0;
while (count < nth){
num=num+1; //find the next prime number
for (i = 2; i <= num; i++){
if (num % i == 0) {
break; //prime not found
}
}
if ( i == num){
count = count+1; //prime found
}
}
System.out.println("The number is: "+num);
我更喜欢创建包含 prime value 和 prime value 索引的 HashMap,试试这个小应用程序:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
public class Nth_Prime {
static boolean checkPrime(int n)
{
for (int i=2;i<n;i++)
{
if(n%i==0)
return false;
}
return true;
}
static HashMap<Integer,Integer> map=new HashMap<Integer, Integer>();
public static void main(String[] args) throws Exception {
BufferedReader stdin = new BufferedReader(new InputStreamReader(
System.in));
map.put(1, 2);
System.out.println("Which Prime number would you like to find?");
while(true)
{
int n = Integer.parseInt(stdin.readLine());
if( n<0)
return;
if(map.containsKey(n))
{
System.out.println("The number is: " + map.get(n));
}
else
{
int size=map.size();
int lastKey=size;//(int) map.keySet().toArray()[size-1];
int lastValue=map.get(lastKey);
for (int i = lastValue; i < 1000; i++) {
if(checkPrime(i))
{
map.put(size, i);
size++;
if(map.containsKey(n))
{
System.out.println("The number is: " + map.get(n));
System.out.println("Which Prime number would you like to find?");
break;
}
}
}
}
}
}
}