java:读取一个int并检查其素性如果不是素数,重复,但最多x次

ngynwnxp  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(223)

很抱歉提出这样一个问题,但我无法理解为什么下面的代码不能正常工作。
正如标题中所写,用户应该为代码输入一个整数,以检查它是否为素数。如果不是,则用户可以输入另一个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
mspsb9vt

mspsb9vt1#

每次函数返回时,都会在这里结束:

prime = true;
        System.out.println("This is a prime.");

数字是1?最后打印“这是一个素数”。
数字是2?最后打印“这是一个素数”。
数字是4?最后打印“这是一个素数”。
号码是42?好吧,最后会打印“this is a prime”很多次,每次函数调用都打印一次。
为了得到正确的递归方面,您必须 return 当您希望函数停止时。
也就是说,这种方法对你想要实现的目标是行不通的。首先关注算法,将计算输入整数个数的部分与确定整数是否为素数的部分分开。

iq3niunx

iq3niunx2#

我个人不会在这里使用递归,从 prime = true ,设置为 false 必要时,在外循环的末尾要求一个新号码:

public static void isPrime(int a, int counter, Scanner scan) {
    boolean prime;
    do {
        prime = true; // <---
        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);
            prime = false; // <---
        } else if (a == 2) {
            prime = true; // well, it was true already
        } 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);
            prime = false; // <---
        } else { // now it's necessary, so 2 won't be tested
            for (int i = 2; i <= Math.sqrt(a); i++) {
                if (a % i == 0) {
                    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 = false; // <---
                    break; // so the message doesn't get repeated many times
                }
            }
        }
        if(prime) {
            System.out.println("This is a prime.");
        } else {
            a = scan.nextInt();
        }
    } while (counter <= 5 && prime == false);
}

相关问题