Рассчитать делители числа в 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> System.out.println(y); > >
Ваш рекурсивный вызов попадает внутрь if() состояние. Отрегулируйте это, правильно разместив > ,
Кроме того, чтобы ограничить выполнение вашего кода вечностью, используйте нижеприведенное условие блокировки в начале вашего метода.
Это рекурсивно вернет список всех делителей до данного n:
public static List allDivisors(int n)< return divHelper(n, 1, new ArrayList<>()); > private static List divHelper(int n, int i, ArrayList 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); >>
Положительные делители натурального числа
Выведите на экран все положительные делители
натурального числа и подсчитать количество делителей,
введённого пользователем с клавиатуры.
Код вроде работает компилировал запускался.
1)Правильно ли составлен код на положительные делители?
2)Когда компилируется код выводит следующее:
Вводите ваше натуральное число — 6 //ввел число
Число 3 делится на — 1 3 6 Количество делителей — 3
Как можно сделать, чтобы выводило так:
Вводите ваше натуральное число — 6 //ввел число
Число 3 делится на — 1 3 6
Количество делителей — 3
Как можно сделать, чтобы делители выводились в обратном порядке:
Вводите ваше натуральное число — 6 //ввел число
Число 3 делится на — 6 3 1
Количество делителей — 3
3) Как можно описать код, на ошибку, если пользователь ввел отрицательное число?
4) Как можно описать код, что на ноль делить нельзя, если пользователь ввел 0?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public class Test { public static void main(String args[]){ int n; int count = 0; System.out.print("Вводите ваше натуральное число - "); Scanner sr = new Scanner(System.in); n = sr.nextInt(); System.out.print("Число " + n + " делится на - " ); for(int i = 1; i = n; i++){ if ((n % i) == 0){ count++; System.out.print(i + " "); } } System.out.println("Количество делителей - " + count); } }
Java. Дано натуральное число n. Среди натуральных чисел от 1 до n найти число с наибольшим количеством делителей.
. JAVA. Вроде бы понятен код, но как выделить число с наибольшим количеством делителей?
import java.util.Scanner;
public class Main
<
public static void main(String[] args) <
System.out.println(«Введите число n»);
int number;
Scanner scanner = new Scanner( System.in );
number = scanner.nextInt();
import java.util.*;
class Main <
public static void main (String[] args) <
System.out.print ("Введите натуральное число: ");
Scanner scan = new Scanner (System.in);
int n = scan.nextInt ();
int cdiv = 0;
int cnum = 0;
int dmax = 0;
int num = 0;
boolean feq = false;
for (int i = n; i > 1; i--) <
cdiv = 0;
for (int j = 1; j if (i % j == 0) <
cdiv++;
cnum = i;
>
>
if (cdiv > dmax) <
dmax = cdiv;
num = cnum;
> else if (cdiv == dmax)
feq = true;
>
if (dmax > 0 && !feq)
System.out.println (String.format ("Число: %d | делителей: %d", num, dmax));
else
System.out.println (String.format ("У всех или у некоторых чисел в данном диаппазоне одинаковое число делителей"));
>
>
можно узнать, почему используются именно cdiv, cnim, dmax и т.д.? еще не очень в этом разбираюсь 🙁 есть ли какой-то смысл в буквах c и d?
Новый Человек Просветленный (31291) Наталья Семакина, Ну, смысл есть, который «на скорую руку» вкладывал. cdiv — считает количество целочисленных делителей для текущего числа. (c — count, d — division) cnum — просто сохраняет текущее число, так как i находится в пространстве. Может это и не нужно, но на всякий случай. Так как cdiv увеличивает счётчик для текущего числа, нам заранее не известно является ли то значение, которое он накопит, максимальным и поэтому сохраняем его по условию (if) в dmax и само число, которому принадлежит наибольшее значение cdiv на текущей итерации. feq — сигнализирует, было ли обнаружено число с таким же количеством делителей. Программу можно упростить, но тут уже не помещается текст больше 800 символов.
Подсчитать количество делителей для всех чисел до N
Мне нужно посчитать все делители для каждого числа в диапазоне 1 to n , Я записал ниже реализацию для, учитывая целое число num подсчитывает количество делителей num , Его сложность O(sqrt(n)) , Таким образом, по всей сложности оказывается O(n * sqrt(n)) , Это может быть уменьшено? Если ДА, то можете ли вы дать алгоритм для этого?
public static int countDivisors(int num) < int limit = (int)Math.sqrt(num); int count = 2; for(int i = 2 ; i > > return count; >
PS:
Эта функция будет вызвана n раз.
3 ответа
Вы можете улучшить наивный подход, используя своего рода обобщенное сито Эратосфена. Вместо того, чтобы просто помечать число как составное, также сохраните первый найденный вами делитель (я делаю это в функции computeDivs ниже).
class Main < // using Sieve of Eratosthenes to factorize all numbers public static int[] computeDivs(int size) < int[] divs = new int[size + 1]; for (int i = 0; i < size + 1; ++i) < divs[i] = 1; >int o = (int)Math.sqrt((double)size); for (int i = 2; i for (int i = 3; i divs[i] = i; if (i > > return divs; > // Counting the divisors using the standard fomula public static int countDivisors(int x, int[] divs) < int result = 1; int currentDivisor = divs[x]; int currentCount = 1; while (currentDivisor != 1) < x /= currentDivisor; int newDivisor = divs[x]; if (newDivisor != currentDivisor) < result *= currentCount + 1; currentDivisor = newDivisor; currentCount = 1; >else < currentCount++; >> if (x != 1) < result *= currentCount + 1; >return result; > public static int countAllDivisors(int upTo) < int[] divs = computeDivs(upTo + 1); int result = 0; for (int i = 1; i return result; > public static void main (String[] args) throws java.lang.Exception < System.out.println(countAllDivisors(15)); >>
Вы также можете увидеть код, выполненный на ideone здесь.
Короче говоря, я использую сито для вычисления наибольшего простого множителя для каждого числа. Используя это, я могу очень эффективно вычислить разложение факторов каждого числа (и я использую это в countDivisors).
Трудно рассчитать сложность сита, но стандартная оценка O(n * log(n)) , Также я уверен, что эту сложность улучшить невозможно.
Вычислить делители числа в 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); >>
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> System.out.println(y); > >
Ваш рекурсивный вызов попадает внутрь условия if() . Отрегулируйте это, разместив > .
Кроме того, чтобы ограничить выполнение кода до вечности, используйте условие блокировки ниже при попрошайничестве вашего метода.
Вы должны иметь условие терминала, указанное при работе с рекурсивными функциями. В этом случае я предлагаю вам вернуть элемент управления, когда 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); >>