Число делителей числа java

Рассчитать делители числа в 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() состояние. Отрегулируйте это, правильно разместив > ,

Читайте также:  Установка питона в ubuntu

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

Это рекурсивно вернет список всех делителей до данного 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); >> 

Источник

Оцените статью