public class primzahlen {
public static void main(String[] args) {
System.out.println(2 % 1);
calculate_primenumber(10);
}
static void calculate_primenumber(int a) {
int zahl = 1;
boolean isprimenumber = false;
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= i; j++) {
if (i % j > 0) {
// No PrimeNumber
isprimenumber = false;
} else {
// Is PrimeNumber
isprimenumber = true;
zahl = i;
System.out.println(zahl);
}
}
}
}
}
我不知道为什么这不起作用。
我想计算10个素数。
但不知何故,它只打印最多10次3次,就是这样。
我不知道我的错误。
我有2个for循环。这就是我如何学习素数计算,我必须使用2 for循环,但它不起作用。我首先想到的是%(其余的)但是当我在纸上做它应该有用。
答案 0 :(得分:1)
当你说
时for (int i = 1; i <= a; i++)
您说&#34;数字从1到a
,&#34;在这种情况下,这是1到10.因此,您只能检查1到10的素数。 a
是您在数字上的上限,用于检查素数。
如果你想获得前10个素数,你将不得不使用一个条件来检查你发现的素数(并保持计数)。
您的模数检查应为(i % j == 0)
- 这意味着j
均分i
,因此是i
的因子。您的立场就是说,如果任何j
不是i
的因素,则该数字会立即合成。这不仅不是一个正确的结论,而且还可以帮助你做出决定。你应该假设它是素数,直到你可以证明它是复合的 - 然后你可以提前决定。
要记住的一件事是,一个数字,mod本身,总是0.同样适用于数字mod 1.所以,你必须确保你不比较任何i
自己或与1.更改第二个for
循环以在j < i
时停止并以j = 2
开头。
for (int i = 1; i <= a; i++) {
isprimenumber = true;
for (int j = 2; j < i; j++) {
// check each number less than this one for factors
if (i % j == 0) {
// found an even divisor, so the number is composite
isprimenumber = false;
break;
}
}
if (isprimenumber) {
System.out.println(i);
}
}
您可以通过注意1
通常不被视为素数来进行其他优化,因此您可以让您的第一个循环为for (int i = 2; i <= a; i++)
并且还考虑到没有更大数的偶数除数超过该数字的一半,因此您可以将第二个循环设为for (int j=2; j < i/2; j++)
。
答案 1 :(得分:1)
您的代码至少有四个问题。
首先,你有%
条件。如果您正在测试号码i
,并且想要查看它是否具有除数j
,那么您需要测试i % j == 0
。如果这是真的,那么这个数字不是素数。但是,你测试它的方式,你告诉它如果i % j
不为零,那么这个数字不是素数。
其次,当您进行测试以查看某些内容是否分为i
时,您无法测试1,并且您无法测试i
本身。因此,
for (int j = 1; j <= i; j++) {
看起来应该更像
for (int j = 2; j < i; j++) {
虽然通常是
for (int j = 2; j < Math.sqrt(i); j++) {
因为一旦超过i
的平方根,您就不需要再搜索了。
第三:你的内部循环在每次迭代时将isprimenumber
设置为true
或false
。那是不对的。如果我们发现i
有除数的情况,我们知道isprimenumber
是false
,我们应该永远再次将其设置为true
,为i
。所以像这样的循环可以工作:
isprimenumber = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
// No PrimeNumber
isprimenumber = false;
}
// If it's non-zero, don't set isprimenumber to true, because if we
// set it to false earlier, then it still should be false!
}
// And wait until we've tested all the j's before we can tell if it's true.
if (isprimenumber) {
}
您也可以在break
之后加isprimenumber = false
,因为一旦我们找到了除数,我们就不需要继续寻找。
for (int j = 2; j < i; j++) {
if (i % j == 0) {
// No PrimeNumber
isprimenumber = false;
break;
}
如果没有break
,循环会继续几次,但它不会做任何有用的事情。 (但它也不会有害。)
第四,你说要打印10个素数,但你的逻辑测试了从1到10的所有数字,并且在该范围内没有10个素数。如果您想要参数a
为10的前10个素数,则无法在i <= a
停止循环:
for (int i = 1; i <= a; i++) {
相反,您需要声明另一个计数器来计算素数的数量。
int count = 0;
当你找到一个素数并打印出来时:
count++;
然后你可以像这样编写你的for
循环:
for (int i = 1; count < a; i++) {
并且当素数达到a
时它将停止。
编辑:我错过了一个错误:我建议的代码会发现1是素数,但从技术上讲它不是(所以说数学家)。所以你应该从i = 2
开始:
for (int i = 2; count < a; i++) {
答案 2 :(得分:0)
这是一种方式
public class Primzahlen {
public static void main(String[] args){
calculate_primenumber(10);
}
static void calculate_primenumber(int a) {
int primesFound = 0;
boolean isprimenumber;
for(int i = 2; primesFound < a; i++){
isprimenumber = true;
for(int j = 2; j < i ; j++){
if(i % j == 0){
isprimenumber = false;
break;
}
}
if(isprimenumber){
primesFound++;
System.out.println(i);
}
}
}
}
但你可以提高效率。这只是一种方式:klick
答案 3 :(得分:-1)
你必须在循环结束时做正确的事情:
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= i; j++) {
if (i % j > 0) {
// No PrimeNumber
isprimenumber = false;
} else {
// Is PrimeNumber
isprimenumber = true;
}
}
if(isprimenumber)
System.out.println(i);
}
如果测试了所有数字,你只能告诉它。