我正在尝试获取一个程序来获取某个范围内的素数(用户输入最大数量),这个名为maxNumber
的变量将用于停止while循环。使用的控制变量从第一个素数2开始,称为i
,用于分别打印出素数(找到时)和自然数。
我的问题是我不确定我的算法在主方法和mutator方法中是否都是正确的,我有一个问题,我把用户输入(最大数字),但没有任何事情发生后 - 基本上,它正在编译和运行,但在输入第一个变量时没有响应。
非常感谢帮助!
import java.util.*;
public class PrimeCalculator {
private static int maxNumber;
private static int divisibleCount;
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int i = 2;
System.out.println("Enter the maximum amount of numbers you want to find prime numbers within: ");
maxNumber = scanner.nextInt();
while(i <= maxNumber)
isPrime(i);
if(divisibleCount < 2)
System.out.println(i + " is a prime number");
if(divisibleCount > 2)
System.out.println(i + " is not a prime number.");
divisibleCount = 0;
i++;
}
public static void isPrime(int n) {
divisibleCount = 0;
for(int x = 1; x <= maxNumber; x++ )
if(n%x == 0)
divisibleCount++;
}
}
答案 0 :(得分:1)
虽然我不认为你要问的是什么,但我会提出一些建议。
首先,在您的主要方法中,将if(divisibleCount < 2)
更改为if(divisibleCount <= 2)
,因为素数除以1且自己(因此,“divisibleCount”为2 )。
另外,在你的while循环中,你应该检查i
是否等于1,并说它不是素数。
如评论中所述,在isPrime方法中,您可以将循环更改为 for(int x = 1; x <=
n
; x++ )
因为一个数字不可能被更大的东西完全分割(即6除以10不能有模数0)
编辑:正如dcsohl建议的那样,让for(int x = 1; x <= Math.sqrt(n); x++)
更好(见comment)
检查语法。在while循环中,您没有打开和关闭括号,因此只有isPrime(i)
在循环中执行。想象
while(i <= maxNumber){
isPrime(i);
}
if(divisibleCount < 2) // ....etc
由于我在循环中永远不会增加,它总是2,所以......我们有一个无限循环!
(一般改进)围绕try-catch块中的maxNumber = scanner.nextInt();
,以避免在输入say,字符串而不是int时崩溃。
这些是我发现的问题,希望我帮助过你。
PS。如果您有任何其他问题(例如通用代码检查),您应该在Code Review而不是Stack Overflow上询问它们
答案 1 :(得分:0)
我不会回答你的Java问题,但枚举素数的常规算法是两千年前希腊数学家发明的Eratosthenes的筛子:
function primes(n)
sieve := makeArray(2..n, True)
for p from 2 to n
if sieve[p]
output p # prime
for i from p*p to n step p
sieve[i] := False
此算法检查从<2> n 的每个数字 p ;如果 p 是素数,则 i 上的循环将 p 的所有倍数标记为 False ; i 循环从 p 的平方开始,因为所有较小的倍数已经被较小的素数标记为 False 。
如果您对使用素数编程感兴趣,我会在我的博客上谦虚地推荐this essay。
答案 2 :(得分:-2)
import java.io.*;
class Prime
{
public static void main(String args[])
{
long i,j,n=1000000100000L;
long sum=0;
long i1=1000000000000L;
long c;
System.out.println("The Prime Numbers are:");
for(i=i1;i<=n;i++)
{
c=0;
for(j=2;j<=10000000;j++)
{
if(i%j==0)
c=c+1;
if(c==1)
break;
}
if(c==0)
{
System.out.println(i);
sum=sum+i;
}
}
System.out.println("The Sum of Prime numbers are:"+sum);
}
}