Загрузить PDF
Загрузить PDF
Число называется делителем (или множителем) другого числа в том случае, если при делении на него получается целый результат без остатка.[1]
Для малого числа (например, 6) определить количество делителей довольно легко: достаточно выписать все возможные произведения двух целых чисел, которые дают заданное число. При работе с большими числами определить количество делителей становится сложнее. Тем не менее, если вы разложите целое число на простые множители, то легко сможете определить число делителей с помощью простой формулы.
-
1
Запишите заданное целое число вверху страницы. Вам понадобится достаточно места для того, чтобы расположить ниже числа дерево множителей. Для разложения числа на простые множители можно использовать и другие методы, которые вы найдете в статье Как разложить число на множители.
- Например, если вы хотите узнать, сколько делителей, или множителей имеет число 24, запишите
вверху страницы.
- Например, если вы хотите узнать, сколько делителей, или множителей имеет число 24, запишите
-
2
Найдите два числа (помимо 1), при перемножении которых получается заданное число. Таким образом вы найдете два делителя, или множителя данного числа. Проведите от данного числа две ветки вниз и запишите на их концах полученные множители.
-
3
Поищите простые множители. Простым множителем называется такое число, которое делится без остатка лишь на само себя и на 1.[2]
Например, число 7 является простым множителем, так как оно делится без остатка лишь на 1 и 7. Для удобства обводите найденные простые множители кружком.- Например, 2 является простым числом, поэтому обведите
кружком.
- Например, 2 является простым числом, поэтому обведите
-
4
Продолжайте раскладывать составные (не простые) числа на множители. Проводите следующие ветки от составных чисел до тех пор, пока все множители не станут простыми. Не забывайте обводить простые числа кружками.
-
5
Представьте каждый простой множитель в степенной форме. Для этого подсчитайте, сколько раз встречается каждый простой множитель в нарисованном дереве множителей. Это число и будет степенью, в которую необходимо возвести данный простой множитель.[3]
-
6
Запишите разложение числа на простые множители. Первоначально заданное число равно произведению простых множителей в соответствующих степенях.
- В нашем примере
.
Реклама
- В нашем примере
-
1
-
2
Подставьте в формулу величины степеней. Будьте внимательны и используйте степени при простых множителях, а не сами множители.
-
3
Сложите величины в скобках. Просто прибавьте 1 к каждой степени.
-
4
Перемножьте полученные величины. В результате вы определите количество делителей, или множителей данного числа
.
Реклама
Советы
- Если число представляет собой квадрат целого числа (например, 36 является квадратом числа 6), то оно имеет нечетное количество делителей. Если же число не является квадратом другого целого числа, количество его делителей четно.
Реклама
Похожие статьи
Об этой статье
Эту страницу просматривали 120 968 раз.
Была ли эта статья полезной?
Это не ответ на ваш вопрос, а другой подход к решению задачи. Можно проверять числа, разлагая их на делители, а можно конструировать подходящие числа из делителей.
Разложим искомое число на простые. Так как в дальнейшем нас будут интересовать нечётные делители, степень двойки выписана отдельно:
n = 2k0 p1k1 p2k2 … piki,
где k0 — целое неотрицательное, k1, k2, …, ki — натуральные, p1, p2, …, pi — различные нечётные простые.
Любой делитель n конструируется как произведение простых из разложения выше. Сколько нечётных делителей мы можем сконструировать? (k1 + 1)(k2 + 1) … (ki + 1). Это произведение может быть равно пяти только если у числа ровно один нечётный простой делитель, который возводится в четвёртую степень.
Подробности можно посмотреть тут: функция делителей.
Искомое число должно иметь вид 2k p4, где k — целое неотрицательное, p — нечётное простое. Сами нечётные делители тогда имеют вид 1, p, p2, p3, p4.
Будем искать такие числа в нужном диапазоне. Функция is_prime
написана как можно проще, оценка показывает, что проверять числа больше 80 не нужно:
def is_prime(n):
return all(n % i != 0 for i in range(2, n))
def numbers(m, n):
i = 3
while True:
if is_prime(i):
j = i ** 4
if n < j:
break
while j <= n:
if m <= j:
yield j
j *= 2
i += 2
print(*sorted(numbers(35_000_000, 40_000_000)), sep='n')
$ time python five_odd_divisors.py 35819648 38950081 39037448 39337984 real 0m0.021s user 0m0.020s sys 0m0.000s
Given two numbers a and b, and a number k which is odd. The task is to find all the numbers between a and b (both inclusive) having exactly k divisors.
Examples:
Input : a = 2, b = 49, k = 3 Output: 4 // Between 2 and 49 there are four numbers // with three divisors // 4 (Divisors 1, 2, 4), 9 (Divisors 1, 3, 9), // 25 (Divisors 1, 5, 25} and 49 (1, 7 and 49) Input : a = 1, b = 100, k = 9 Output: 2 // between 1 and 100 there are 36 (1, 2, 3, 4, 6, 9, 12, 18, 36) // and 100 (1, 2, 4, 5, 10, 20, 25, 50, 100) having exactly 9 // divisors
This problem has simple solution, here we are given that k is odd and we know that only perfect square numbers have odd number of divisors , so we just need to check all perfect square numbers between a and b, and calculate divisors of only those perfect square numbers.
C++
#include<bits/stdc++.h>
using
namespace
std;
bool
isPerfect(
int
n)
{
int
s =
sqrt
(n);
return
(s*s == n);
}
int
divisorsCount(
int
n)
{
int
count=0;
for
(
int
i=1; i<=
sqrt
(n)+1; i++)
{
if
(n%i==0)
{
if
(n/i == i)
count += 1;
else
count += 2;
}
}
return
count;
}
int
kDivisors(
int
a,
int
b,
int
k)
{
int
count = 0;
for
(
int
i=a; i<=b; i++)
{
if
(isPerfect(i))
if
(divisors(i) == k)
count++;
}
return
count;
}
int
main()
{
int
a = 2, b = 49, k = 3;
cout << kDivisors(a, b, k);
return
0;
}
Java
import
java.io.*;
import
java.math.*;
class
GFG {
static
boolean
isPerfect(
int
n)
{
int
s = (
int
)(Math.sqrt(n));
return
(s*s == n);
}
static
int
divisorsCount(
int
n)
{
int
count=
0
;
for
(
int
i =
1
; i <= Math.sqrt(n) +
1
; i++)
{
if
(n % i ==
0
)
{
if
(n / i == i)
count +=
1
;
else
count +=
2
;
}
}
return
count;
}
static
int
kDivisors(
int
a,
int
b,
int
k)
{
int
count =
0
;
for
(
int
i = a; i <= b; i++)
{
if
(isPerfect(i))
if
(divisorsCount(i) == k)
count++;
}
return
count;
}
public
static
void
main(String args[])
{
int
a =
21
, b =
149
, k =
333
;
System.out.println(kDivisors(a, b, k));
}
}
Python3
import
math
def
isPerfect(n) :
s
=
math.sqrt(n)
return
(s
*
s
=
=
n)
def
divisorsCount(n) :
count
=
0
for
i
in
range
(
1
, (
int
)(math.sqrt(n)
+
2
)) :
if
(n
%
i
=
=
0
) :
if
(n
/
/
i
=
=
i) :
count
=
count
+
1
else
:
count
=
count
+
2
return
count
def
kDivisors(a, b, k) :
count
=
0
for
i
in
range
(a, b
+
1
) :
if
(isPerfect(i)) :
if
(divisorsCount(i)
=
=
k) :
count
=
count
+
1
return
count
a
=
2
b
=
49
k
=
3
print
(kDivisors(a, b, k))
C#
using
System;
class
GFG {
static
bool
isPerfect(
int
n)
{
int
s = (
int
)(Math.Sqrt(n));
return
(s * s == n);
}
static
int
divisorsCount(
int
n)
{
int
count=0;
for
(
int
i = 1; i <= Math.Sqrt(n) + 1; i++)
{
if
(n % i == 0)
{
if
(n / i == i)
count += 1;
else
count += 2;
}
}
return
count;
}
static
int
kDivisors(
int
a,
int
b,
int
k)
{
int
count = 0;
for
(
int
i = a; i <= b; i++)
{
if
(isPerfect(i))
if
(divisorsCount(i) == k)
count++;
}
return
count;
}
public
static
void
Main(String []args)
{
int
a = 21, b = 149, k = 333;
Console.Write(kDivisors(a, b, k));
}
}
PHP
<?php
function
isPerfect(
$n
)
{
$s
= sqrt(
$n
);
return
(
$s
*
$s
==
$n
);
}
function
divisorsCount(
$n
)
{
$count
= 0;
for
(
$i
= 1;
$i
<= sqrt(
$n
) + 1;
$i
++)
{
if
(
$n
%
$i
== 0)
{
if
(
$n
/
$i
==
$i
)
$count
+= 1;
else
$count
+= 2;
}
}
return
$count
;
}
function
kDivisors(
$a
,
$b
,
$k
)
{
$count
= 0;
for
(
$i
=
$a
;
$i
<=
$b
;
$i
++)
{
if
(isPerfect(
$i
))
if
(divisorsCount(
$i
) ==
$k
)
$count
++;
}
return
$count
;
}
$a
= 2;
$b
= 49;
$k
= 3;
echo
kDivisors(
$a
,
$b
,
$k
);
?>
Javascript
<script>
function
isPerfect(n)
{
var
s = parseInt((Math.sqrt(n)));
return
(s * s == n);
}
function
divisorsCount(n)
{
var
count=0;
for
(
var
i = 1; i <= parseInt(Math.sqrt(n)) + 1; i++)
{
if
(n % i == 0)
{
if
(parseInt(n / i) == i)
count += 1;
else
count += 2;
}
}
return
count;
}
function
kDivisors(a, b, k)
{
var
count = 0;
for
(
var
i = a; i <= b; i++)
{
if
(isPerfect(i))
{
if
(divisorsCount(i)==k)
{
count++;
}
}
}
return
count;
}
var
a = 2, b = 49, k = 3;
document.write(kDivisors(a, b, k));
</script>
Output:
4
Time Complexity: O(nsqrtn) , where n is the range of a and b
Auxiliary Space: O(1)
This problem can be solved more efficiently. Please refer method 2 of below post for an efficient solution.
Number of perfect squares between two given numbers
This article is contributed by Aarti_Rathi and Shashank Mishra ( Gullu ). If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Last Updated :
23 Jun, 2022
Like Article
Save Article
0 / 0 / 0 Регистрация: 05.11.2018 Сообщений: 20 |
|
1 |
|
Найти количество нечетных делителей числа. Определить, является ли число простым05.11.2018, 17:29. Показов 8505. Ответов 13
Дано натуральное число N. Найти количество нечетных делителей числа. Определить, является ли число простым. Заранее спасибо.
0 |
JuriiMW 5056 / 2630 / 2345 Регистрация: 10.12.2014 Сообщений: 9,993 |
||||
05.11.2018, 17:52 |
3 |
|||
0 |
Ajhatesyou666 0 / 0 / 0 Регистрация: 05.11.2018 Сообщений: 20 |
||||
05.11.2018, 18:02 [ТС] |
4 |
|||
Кто понимает, прощу проверить является данный код верным:
0 |
5056 / 2630 / 2345 Регистрация: 10.12.2014 Сообщений: 9,993 |
|
05.11.2018, 18:17 |
5 |
Конечно нет! Введите число число простое Добавлено через 52 секунды Введите число число простое Явные ошибки!
0 |
0 / 0 / 0 Регистрация: 05.11.2018 Сообщений: 20 |
|
05.11.2018, 18:18 [ТС] |
6 |
А если я не буду вводить число с минусом ?
0 |
6805 / 4564 / 4817 Регистрация: 05.06.2014 Сообщений: 22,438 |
|
05.11.2018, 18:19 |
7 |
А если я не буду вводить число с минусом ? И не надо. У вас в условии:
Дано натуральное число N
0 |
5056 / 2630 / 2345 Регистрация: 10.12.2014 Сообщений: 9,993 |
|
05.11.2018, 18:23 |
8 |
Ну 1 ведь не простое!
0 |
Ajhatesyou666 0 / 0 / 0 Регистрация: 05.11.2018 Сообщений: 20 |
||||
05.11.2018, 19:05 [ТС] |
9 |
|||
Получилось что-то такое, но не получается сделать с единицей, выводит что оно простое
0 |
Get_Over_Here 79 / 49 / 23 Регистрация: 15.07.2018 Сообщений: 255 |
||||
05.11.2018, 19:08 |
10 |
|||
JuriiMW, С числом 4 ваша программа не проходит Добавлено через 2 минуты
P.S. Возможно не так красиво и правильно, но всё же он работает
0 |
0 / 0 / 0 Регистрация: 05.11.2018 Сообщений: 20 |
|
05.11.2018, 19:12 [ТС] |
11 |
Вы походу меня перепутали с ним, он вроде не писал код.
0 |
79 / 49 / 23 Регистрация: 15.07.2018 Сообщений: 255 |
|
05.11.2018, 19:14 |
12 |
Ajhatesyou666, Нет, код написан в самом начале темы после сообщения ZX Spectrum-128
0 |
0 / 0 / 0 Регистрация: 05.11.2018 Сообщений: 20 |
|
05.11.2018, 19:16 [ТС] |
13 |
Да, не заметил, извиняюсь.
0 |
Get_Over_Here 79 / 49 / 23 Регистрация: 15.07.2018 Сообщений: 255 |
||||
05.11.2018, 19:40 |
14 |
|||
Вариант оказался чуточку недоработан, вот доработанный:
0 |
|
���������: 3 ������: 6,7,8 |
�������� ����������� |
�������
�) �������� 10 ������ ����������� �����, ������� ��ޣ���� ����� ��������� (� ����� ��������� ���������� ������� � ���� �����).
�) ���������� �������������� � �������� �������, ����������� ����� ��������� ����� �����.
�������
�) ��� �������� � ������ 30365, ����������� ����� ����� ��ޣ���� ����� ��������� ����� � ������ �����, ����� ��� �������� ������ ���������.
�����
�) 1, 4, 9, 16, 25, 36, 49, 64, 81, 100.
��������� � ���������� �������������
��������� | |
�������� | ������ ��.���������� |
���/����� | |
����� | 03 |
���� | 1980 |
������ | |
����� | 03 |