好吧,我的问题不在于如何弄清楚一个数字是否为素数,因为我认为我认为这一点,但更多的是如何让它正确显示。
这是我的代码:
public static void main(String[] args) {
// Declare Variables
int randomNumbers = 0;
int sum = 0;
//Loop for number generation and print out numbers
System.out.print("The five random numbers are: ");
for (int i = 0; i <= 4; i++)
{
randomNumbers = (int)(Math.random()*20);
sum += randomNumbers;
if (i == 4) {
System.out.println("and " + randomNumbers + ".");
}
else {
System.out.print(randomNumbers + ", ");
}
}
//Display Sum
System.out.println("\nThe sum of these five numbers is " + sum + ".\n");
//Determine if the sum is prime and display results
for(int p = 2; p < sum; p++) {
if(sum % p == 0)
System.out.println("The sum is not a prime number.");
else
System.out.println("The sum is a prime number.");
break;
}
}
}
现在我的问题是,如果数字最终是9,它会说它是素数,但事实并非如此。我认为问题是中断在一个循环后停止它所以它不是递增变量p所以它只测试除以2(我认为)。但是如果我删除断点,它将在每次传递中打印出“和/不是素数”,直到它退出循环。不知道该怎么做。
答案 0 :(得分:5)
您查找数字是否为素数的方法是正确的方法。 为了使它不会一直打印出数字是否为素数,你可以有一个外部变量,它代表数字是否为素数。
如
boolean prime = true;
for (int p = 2; p < sum; p++) {
if (sum % p == 0) {
prime = false;
break;
}
}
if (prime)
System.out.println("The sum is a prime number.");
else
System.out.println("The sum is not a prime number.");
通过这种方法,程序将假定数字为素数,直到证明错误为止。因此,当它发现它不是素数时,它会将变量设置为false并突破循环。
然后在循环结束后,你只需要打印数字是否为素数。
一种可以使这个循环更快的方法是从p = 2到p =和的平方根。因此,使用此方法,您的for循环将如下所示:
double sq = Math.sqrt((double)sum);
for (int p = 2; p < sq; p++) {
//Rest of code goes here
}
希望这有帮助
答案 1 :(得分:5)
你需要存储数字是否在循环外的布尔值中是素数:
//Determine if the sum is prime and display results
boolean isPrime = true;
for(int p = 2; p < sum; p++) {
if(sum % p == 0){
isPrime = false;
break;
}
}
if(isPrime){
System.out.println("The sum is a prime number.");
} else {
System.out.println("The sum is not a prime number.");
}
答案 2 :(得分:1)
你是对的,目前你的代码测试除以2,而break命令在一个循环后停止。
第一次循环后(p == 2),break
将始终停止循环。
对代码的最快修复将改变循环部分,如下所示:
boolean isPrime=true;
for(int p = 2; p < sum; p++) {
if(sum % p == 0) {
isPrime=false;
System.out.println("The sum is not a prime number.");
break;
}
}
if (isPrime)
System.out.println("The sum is a prime number.");
此代码可以提高效率和代码优雅。
为了提高效率,您不需要通过小于总和的所有数字来检查可分性,这足以检查所有小于平方和的数字。
要获得更好的代码,请创建一个单独的函数来测试数字是否为素数。
这是一个实现两者的例子。
// tests if n is prime
public static boolean isPrime(int n) {
if (n<2) return false;
for(int p = 2; p < Math.sqrt(n); p++) {
if(n % p == 0) return false; // enough to find one devisor to show n is not a prime
}
return true; // no factors smaller than sqrt(n) were found
}
public static void main(String []args){
...
System.out.println("sum is "+ sum);
if (isPrime(sum))
System.out.println("The sum is a prime number.");
else
System.out.println("The sum is not a prime number.");
}
答案 3 :(得分:1)
到目前为止已经发布了许多答案,这些答案是正确的,但没有一个是优化的。这就是为什么我想与你分享优化代码来确定素数的原因。请看下面的代码片段......
private static boolean isPrime(int iNum) {
boolean bResult = true;
if (iNum <= 1 || iNum != 2 && iNum % 2 == 0) {
bResult = false;
} else {
int iSqrt = (int) Math.sqrt(iNum);
for (int i = 3; i < iSqrt; i += 2) {
if (iNum % i == 0) {
bResult = false;
break;
}
}
}
return bResult;
}
上述代码的好处 - :
for
循环。for
循环变量增加2而不是1。for
循环迭代到数字的平方根而不是数字。解释 - :
我已经提到了以上四点,我将逐一解释。代码必须针对无效输入而不是仅针对有效输入进行适当编写。到目前为止所写的答案都限于有效的输入范围iNum >=2
。
我们应该知道只有奇数可以是素数, 注意:2是唯一一个素数。 所以我们必须不为偶数运行for
循环。
我们不能为它的变量for
的偶数值运行i
循环,因为我们知道只有偶数才能偶数。我已经在上面提到过,只有奇数可以是素数,除了2是偶数。 因此,for
中的变量i
的偶数值无需在for
循环内运行代码。
我们应该只将for
循环迭代到平方根而不是数字。很少有答案实现了这一点,但我仍然想在这里提及它。
答案 4 :(得分:1)
使用Apache Commons Math 素性测试,方法与int
范围内的素数相关。您可以在GitHub上找到源代码。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
// org.apache.commons.math3.primes.Primes
Primes.isPrime(2147483629);
它以这样的方式使用米勒 - 拉宾概率检验 结果是有保证的:它使用第一个素数作为连续 base(请参阅Menezes, table 4.1 /第140页的应用加密手册)。
如果您正在寻找大于Integer.MAX_VALUE
的素数:
使用BigInteger#isProbablePrime(int certainty)
预先验证主要候选人
如果此BigInteger可能是素数,则返回true,否则返回false 肯定复合。如果确定性≤0,则返回true。 参数:确定性 - 调用者不确定性的度量 愿意容忍:如果调用返回true则概率为 这个BigInteger是素数超过(1 - 1/2确定性)。执行 此方法的时间与此参数的值成比例。
接下来使用"AKS Primality Test"检查候选人是否确实是素数。
答案 5 :(得分:1)
最有效的时间复杂性:
public static boolean isPrime(int num) {
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}