我需要编写一个应该计算前200个素数的代码,但只要我无法解释所有内容,我就无法处理它。我使用来自互联网的一段代码作为参考(http://crab.rutgers.edu/~dhong/cs325/chapter3/PrimeNumber.java)。
整个代码:
public class Opdracht3 {
public static void main(String[] args) {
int limiet = 200;
int counter = 1;
int testpriem = 3;
boolean isPriem;
while (counter <= limiet) {
isPriem = true;
for (int i = 2; i <= testpriem / 2; i++) {
if (testpriem % i == 0) {
isPriem = false;
break;
}
}
if (isPriem) {
System.out.println(counter + ": " + testpriem);
counter++;
}
testpriem++;
}
}
}
部分代码验证数字是否为复合数。如果 testpriem 是复合的,那么就会退出循环并重新开始。否则,它会继续并打印素数 testpriem 。
问题在于:
for (int i = 2; i <= testpriem / 2; i++) {
if (testpriem % i == 0) {
isPriem = false;
break;
}
}
我测试了i发生了什么,并且它以某种方式识别出计算复合所需的除数。 (4除数是2,9除数是3,221除数是13)但是我为什么感到惊讶。
有什么想法吗?
答案 0 :(得分:1)
Java中的%
or ("remainder") operator将一个操作数除以另一个操作数,并将余数作为结果返回。当然,如果整数x
可被另一个整数y
整除(意味着x/y =
某个整数z
且余数为零),那么x
就不能是素数。
答案 1 :(得分:0)
首先记住每个数字能够除以一半或更少。考虑数字7可能除以1,2,3,因为在3之后,如果尝试将数字除以4意味着4x2 = 8大于7.所以这是以这种方式找到除数的最佳方式。还有一件事,每个数字除以1和数字本身。所以,如果数字除以1或自身,那么它被称为素数,所以我从2开始。
现在考虑testpriem = 7,这样你就会得到像
这样的循环for (int i = 2; i <= 7 / 2(i.e 3); i++)
{
if(7 % i == 0)
{
isPriem = false;
break;
}
所以第一次检查7%2 = 1所以条件为假。再次检查7%3 = 1再次条件错误。现在这个条件完全填满了i&lt; = 7/2(即3)所以循环停止了,结果7号是素数
答案 2 :(得分:0)
好吧,如果testpriem % i == 0
,则表示i
除了testpriem,这意味着testpriem
不是素数而i
是第一个分隔符。 %是模运算,这是除法的其余部分。
答案 3 :(得分:0)
中断停止for循环并移动到while循环中的下一个位置。因此它不会为当前测试的数字重新启动for循环。
由于效率原因,使用了休息时间。您可以删除它,算法仍然可以正常工作但速度较慢。