Рассчитать делители числа в 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);
}
}