我有一个计算前 200 个素数的程序,但我不明白其中的公式
I have a program that calculates the first 200 prime numbers, but I do not understand a formula in it
我需要写一个代码来计算前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)但我很惊讶为什么。
有什么想法吗?
Java 中的 %
or ("remainder") operator 将一个操作数除以另一个操作数,returns 余数作为结果。当然,如果整数 x
可以被另一个整数 y
整除(意思是 x/y =
某个整数 z
余数为零),那么 x
不能成为素数。
首先记住所有能除以其一半或更少的数字。考虑数字 7 可能除以 1、2、3,因为在 3 之后,如果尝试将数字除以 4 意味着 4x2 = 8 大于 7。因此以这种方式找到除数是最佳方法。每个数字除以 1 和数字本身还有一件事。所以如果 number number 除以 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 <= 7 / 2(即 3) 所以循环停止并且结果 7 数字是质数
嗯,如果testpriem % i == 0
,就是说i
整除testpriem,也就是说testpriem
不是素数而i
是它的第一个除数. % 是模运算,也就是除法的其余部分。
break 停止for 循环并移动到while 循环中的下一个位置。所以它不会为当前测试的数字重新启动 for 循环。
中断是出于效率考虑。您可以删除它,算法仍然可以正常工作,但速度较慢。
我需要写一个代码来计算前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)但我很惊讶为什么。
有什么想法吗?
Java 中的 %
or ("remainder") operator 将一个操作数除以另一个操作数,returns 余数作为结果。当然,如果整数 x
可以被另一个整数 y
整除(意思是 x/y =
某个整数 z
余数为零),那么 x
不能成为素数。
首先记住所有能除以其一半或更少的数字。考虑数字 7 可能除以 1、2、3,因为在 3 之后,如果尝试将数字除以 4 意味着 4x2 = 8 大于 7。因此以这种方式找到除数是最佳方法。每个数字除以 1 和数字本身还有一件事。所以如果 number number 除以 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 <= 7 / 2(即 3) 所以循环停止并且结果 7 数字是质数
嗯,如果testpriem % i == 0
,就是说i
整除testpriem,也就是说testpriem
不是素数而i
是它的第一个除数. % 是模运算,也就是除法的其余部分。
break 停止for 循环并移动到while 循环中的下一个位置。所以它不会为当前测试的数字重新启动 for 循环。
中断是出于效率考虑。您可以删除它,算法仍然可以正常工作,但速度较慢。