Рассчитать делители числа в Java

Я ищу помощь для моего кода. Я хочу знать все делители числа, используя рекурсию в Java, но моя программа вычисляет только 1 или 2 делителя, но не все. Вот мой код:

import java.io.*;

public class Ejercicio {
    static void Divisor(int num, int presuntoDivisor){
        if (num%presuntoDivisor == 0) {
            System.out.println("un divisor es "+ presuntoDivisor);
            presuntoDivisor++;
            Divisor(num, presuntoDivisor);
        }
    }

    public static void main(String[] args) throws NumberFormatException, IOException {
        int num, presunto=1;
        BufferedReader linea = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("introduce un numero: ");
        num = Integer.parseInt(linea.readLine());
        Divisor(num, presunto);
    }
}

5 ответов

Решение

Попробуй это -

import java.io.*;

public class Ejercicio {
    private static void divisor(int num, int presuntoDivisor){
        if(num % presuntoDivisor == 0) 
            System.out.println("un divisor es "+ presuntoDivisor);

        if(presuntoDivisor == num) return;

        divisor(num, ++presuntoDivisor);
    }

    public static void main(String[] args) throws NumberFormatException, IOException {
        int num, presunto=1;

        BufferedReader linea = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("introduce un numero: ");

        num = Integer.parseInt(linea.readLine());
        divisor(num, presunto);
    }
}

Выход:

introduce un numero: 100
un divisor es 1
un divisor es 2
un divisor es 4
un divisor es 5
un divisor es 10
un divisor es 20
un divisor es 25
un divisor es 50
un divisor es 100

Попробуй это

import java.util.Scanner;

public class Ejercicio{
    public static void main(String args[]){
        Scanner x=new Scanner(System.in);
        System.out.print("Enter the number :  ");
        long y=x.nextInt(),i;

        System.out.print("Divisors of "+y+" = 1 , ");

        for( i=2;i<y;i++){
            long z=y%i;
            if (z == 0) {
                System.out.print(i + ", ");
            }
        }

        System.out.println(y);
    }
}

Ваш рекурсивный вызов попадает внутрь if() состояние. Отрегулируйте это, правильно разместив },

Кроме того, чтобы ограничить выполнение вашего кода вечностью, используйте нижеприведенное условие блокировки в начале вашего метода.

if(num / 2 < presuntoDivisor){
    return;
}

Это рекурсивно вернет список всех делителей до данного n:

public static List<Integer> allDivisors(int n){
    return divHelper(n, 1, new ArrayList<>());
}

private static List<Integer> divHelper(int n, int i, ArrayList<Integer> res) {
    if (n < 1 || i > n) return res;
    if (n % i == 0) {
        res.add(i);
    }
    return divHelper(n, i+1, res);
}

System.out.println(allDivisors(12));

[1, 2, 3, 4, 6, 12]

System.out.println(allDivisors(7)); // премьер

[1, 7]

System.out.println(allDivisors (1));

[1]

Вам нужно указать условие терминала при работе с рекурсивными функциями. В этом случае я бы предложил вам вернуть элемент управления, когда presuntoDivisor становится больше, чем число / 2. Кроме того, вам необходимо проверить все возможные числа. Прямо сейчас код выполняется только тогда, когда остаток равен 0.

Следующая функция должна работать.

public class Ejercicio {
static void Divisor(int num, int presuntoDivisor){
        if(num%presuntoDivisor == 0)
            System.out.println("un divisor es "+ presuntoDivisor);
        presuntoDivisor++;
        if (presuntoDivisor > num / 2)
            return;
        Divisor(num, presuntoDivisor);

}

Попробуй это,

import java.io.*;

public class Ejercicio {
        static void Divisor(int num, int presuntoDivisor){
                if(presuntoDivisor < num){
                    if (num%presuntoDivisor == 0){
                        System.out.println("un divisor es "+ presuntoDivisor);
                    }
                    Divisor(num, ++presuntoDivisor);
                }
        }

        public static void main(String[] args) throws NumberFormatException, IOException
        {
            int num, presunto=1;
            BufferedReader linea = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("introduce un numero: ");
            num= Integer.parseInt(linea.readLine());
            Divisor(num, presunto);
        }
}
Другие вопросы по тегам