很抱歉提出这样一个问题,但我无法理解为什么下面的代码不能正常工作。
正如标题中所写,用户应该为代码输入一个整数,以检查它是否为素数。如果不是,则用户可以输入另一个int,但最多输入5次。
我认为素性检查是有效的,但困扰我的是递归,因为它打印出来太多时,首先给一个非素数,然后素数。
我希望有人能向我解释为什么会这样……:)
代码如下:
import java.util.Scanner;
public class Task6v5 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Enter an int: ");
int a = scan.nextInt();
int counter = 0;
isPrime(a, counter, scan);
}
public static void isPrime(int a, int counter, Scanner scan) {
boolean prime;
do {
if (a <= 1) {
counter = counter + 1;
System.out.println("Int to small. Enter a bigger one."
+ " Counter: " + counter);
a = scan.nextInt();
isPrime(a, counter, scan);
} else if (a == 2) {
prime = true;
} else if (a % 2 == 0) {
counter = counter + 1;
System.out.println("This int is even, "
+ "but not a 2. "
+ "Enter an other int."
+ " Counter: " + counter);
a = scan.nextInt();
isPrime(a, counter, scan);
}
for (int i = 2; i <= Math.sqrt(a); i++) {
if (a % i == 0) {
//System.out.println("Are we there?");
//isPrime = false;
counter = counter + 1;
System.out.println("This int is not a prime. "
+ "Enter an other int. Counter: " + counter);
a = scan.nextInt();
isPrime(a, counter, scan);
}
}
prime = true;
System.out.println("This is a prime.");
} while (counter <= 5 && prime == false);
}
}
我得到这个输出,例如:
Enter an int:
1
Int to small. Enter a bigger one. Counter: 1
4
This int is even, but not a 2. Enter an other int. Counter: 2
5
This is a prime.
This is a prime.
This int is not a prime. Enter an other int. Counter: 2
2条答案
按热度按时间mspsb9vt1#
每次函数返回时,都会在这里结束:
数字是1?最后打印“这是一个素数”。
数字是2?最后打印“这是一个素数”。
数字是4?最后打印“这是一个素数”。
号码是42?好吧,最后会打印“this is a prime”很多次,每次函数调用都打印一次。
为了得到正确的递归方面,您必须
return
当您希望函数停止时。也就是说,这种方法对你想要实现的目标是行不通的。首先关注算法,将计算输入整数个数的部分与确定整数是否为素数的部分分开。
iq3niunx2#
我个人不会在这里使用递归,从
prime = true
,设置为false
必要时,在外循环的末尾要求一个新号码: