好吧,我的问题不是如何弄清楚一个数字是否是素数,因为我想我已经弄清楚了,而是如何让它正确显示。
下面是我的代码:
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,它会说它是质数,我认为问题是break在一个循环后停止它所以它不是递增变量p所以它只是测试除以2(我想)。但是如果我删除断点,它会在每次传递时打印出“和是/不是素数”,直到它退出循环。不确定在这里该怎么做。
7条答案
按热度按时间dbf7pr2w1#
你的方法是正确的,为了使它不一致地输出一个数是否是素数,你可以有一个外部变量,它代表这个数是否是素数。
如
通过这种方法,程序会假设这个数是素数,直到它证明这个数是错的,所以当它发现这个数不是素数时,它会将变量设置为false,然后跳出循环。
然后在循环结束后,你只需要打印出这个数字是否是素数。
一种可以加快循环速度的方法是从p = 2的时候到p = sum的平方根的时候。所以使用这种方法,for循环看起来会像这样:
希望这对你有帮助
flvlnr442#
你需要在循环外的一个布尔值中存储这个数是否是素数:
kmynzznz3#
您是对的,当前您的代码测试除以2,并且break命令在一个循环后停止。
第一次执行循环(p==2)后,
break
将始终停止循环。最快的代码修复方法是将循环部分更改为:
可以改进此代码以提高效率和代码的优雅性。
为了提高效率,您不需要检查所有小于sum的数的可分性,检查所有小于sum平方根的数就足够了。
为了获得更好的代码,请创建一个单独的函数来测试一个数字是否为素数。
下面是一个同时实现这两种功能的示例。
6pp0gazn4#
小质数
使用Apache Commons Math素数性测试,方法与
int
范围内的素数有关。您可以在GitHub上找到源代码。它使用Miller-Rabin概率检验,以保证得到一个结果:它使用第一个素数作为连续基数(参见Handbook of Applied Cryptography by Menezes, table 4.1/ page 140)。
大质数
如果要寻找大于
Integer.MAX_VALUE
的素数:1.使用
BigInteger#isProbablePrime(int certainty)
预验证主要候选项如果这个BigInteger可能是素数,则返回true;如果它肯定是合数,则返回false。如果确定性≤ 0,则返回true。参数:确定性-呼叫者愿意容忍的不确定性的度量:如果调用返回true,则此BigInteger为质数的概率超过(1 - 1/2certainty)。此方法的执行时间与此参数的值成比例。
1.接下来使用"AKS Primality Test"来检查候选是否确实是素数。
4dc9hkyq5#
到目前为止,已经有很多答案是正确的,但是没有一个是经过优化的。这就是为什么我想在这里与你分享优化后的代码来确定素数。请看下面的代码片段...
以上代码的优点-:
1.它也适用于负数和0 & 1。
1.它只对奇数运行
for
循环。1.它会将
for
循环变量增加2而不是1。1.它只会迭代
for
循环到number的平方根,而不是number.解说--:
我已经提到了上面的四点,我将逐一解释。代码必须适当地为无效输入编写,而不是只为有效输入编写。到目前为止所写的任何答案都被限制在有效输入范围内,其中数字为
iNum >=2
。我们应该知道,只有奇数才能是素数,**注-:2是唯一一个偶数素数。因此,我们不能对偶数运行
for
循环。我们不能对变量
i
的偶数值运行for
循环,因为我们知道只有偶数才能被偶数整除。我在上面已经提到过,只有奇数才能素数,除了2是偶数。因此,不需要对for
中变量i
的偶数值运行for
循环内的代码。我们应该只迭代
for
循环到数字的平方根,而不是数字。很少有答案实现了这一点,但我仍然想在这里提到它。wgmfuz8q6#
时间复杂度为O()),时间复杂度为O(n)。
ndasle7k7#
您可以使用JavaBigInteger类的isProbablePrime方法以一种简单的方式确定并打印出该和是否为素数。
您可以在www.example.com阅读有关此方法的更多https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#isProbablePrime%28int%29