Как найти нечетное количество делителей


Загрузить PDF


Загрузить PDF

Число называется делителем (или множителем) другого числа в том случае, если при делении на него получается целый результат без остатка.[1]
Для малого числа (например, 6) определить количество делителей довольно легко: достаточно выписать все возможные произведения двух целых чисел, которые дают заданное число. При работе с большими числами определить количество делителей становится сложнее. Тем не менее, если вы разложите целое число на простые множители, то легко сможете определить число делителей с помощью простой формулы.

  1. Изображение с названием Determine the Number of Divisors of an Integer Step 1

    1

    Запишите заданное целое число вверху страницы. Вам понадобится достаточно места для того, чтобы расположить ниже числа дерево множителей. Для разложения числа на простые множители можно использовать и другие методы, которые вы найдете в статье Как разложить число на множители.

    • Например, если вы хотите узнать, сколько делителей, или множителей имеет число 24, запишите 24 вверху страницы.
  2. Изображение с названием Determine the Number of Divisors of an Integer Step 2

    2

    Найдите два числа (помимо 1), при перемножении которых получается заданное число. Таким образом вы найдете два делителя, или множителя данного числа. Проведите от данного числа две ветки вниз и запишите на их концах полученные множители.

  3. Изображение с названием Determine the Number of Divisors of an Integer Step 3

    3

    Поищите простые множители. Простым множителем называется такое число, которое делится без остатка лишь на само себя и на 1.[2]
    Например, число 7 является простым множителем, так как оно делится без остатка лишь на 1 и 7. Для удобства обводите найденные простые множители кружком.

    • Например, 2 является простым числом, поэтому обведите  2 кружком.
  4. Изображение с названием Determine the Number of Divisors of an Integer Step 4

    4

    Продолжайте раскладывать составные (не простые) числа на множители. Проводите следующие ветки от составных чисел до тех пор, пока все множители не станут простыми. Не забывайте обводить простые числа кружками.

  5. Изображение с названием Determine the Number of Divisors of an Integer Step 5

    5

    Представьте каждый простой множитель в степенной форме. Для этого подсчитайте, сколько раз встречается каждый простой множитель в нарисованном дереве множителей. Это число и будет степенью, в которую необходимо возвести данный простой множитель.[3]

  6. Изображение с названием Determine the Number of Divisors of an Integer Step 6

    6

    Запишите разложение числа на простые множители. Первоначально заданное число равно произведению простых множителей в соответствующих степенях.

    • В нашем примере 24=2^{{3}}times 3^{{1}}.

    Реклама

  1. Изображение с названием Determine the Number of Divisors of an Integer Step 7

    1

  2. Изображение с названием Determine the Number of Divisors of an Integer Step 8

    2

    Подставьте в формулу величины степеней. Будьте внимательны и используйте степени при простых множителях, а не сами множители.

  3. Изображение с названием Determine the Number of Divisors of an Integer Step 9

    3

    Сложите величины в скобках. Просто прибавьте 1 к каждой степени.

  4. Изображение с названием Determine the Number of Divisors of an Integer Step 10

    4

    Перемножьте полученные величины. В результате вы определите количество делителей, или множителей данного числа n.

    Реклама

Советы

  • Если число представляет собой квадрат целого числа (например, 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

Pascal
1
2
3
4
5
begin
  var n:=ReadInteger;
  WriteLn(Range(1,n,2).Count(x->n mod x=0));
  WriteLn('Простое = ',(n>1)and((n=2)or(Range(1,n,2).Count(x->n mod x=0)=(odd(n)?2:1))));
end.



0



Ajhatesyou666

0 / 0 / 0

Регистрация: 05.11.2018

Сообщений: 20

05.11.2018, 18:02

 [ТС]

4

Кто понимает, прощу проверить является данный код верным:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Var K,n,i,b: integer;
begin
writeln('Введите число');
readln(K); n:=0;
for i:=1 to K do
if (i mod 2=1)and(K mod i =0) then n:=n+1;
writeln('Количество нечетных делителей числа равно ', n);
readln;
begin
for i:=1 to b do 
if (b mod i = 0) then
k:=k+1;
if k >2 then 
 writeln ('число не простое')
else
writeln ('число простое');
end;
end.



0



5056 / 2630 / 2345

Регистрация: 10.12.2014

Сообщений: 9,993

05.11.2018, 18:17

5

Конечно нет!
Вот как неверно работает ваша программа:

Введите число
-15
Количество нечетных делителей числа равно 0

число простое

Добавлено через 52 секунды
А ещё вот:

Введите число
1
Количество нечетных делителей числа равно 1

число простое

Явные ошибки!



0



0 / 0 / 0

Регистрация: 05.11.2018

Сообщений: 20

05.11.2018, 18:18

 [ТС]

6

А если я не буду вводить число с минусом ?



0



Эксперт Pascal/Delphi

6805 / 4564 / 4817

Регистрация: 05.06.2014

Сообщений: 22,438

05.11.2018, 18:19

7

Цитата
Сообщение от Ajhatesyou666
Посмотреть сообщение

А если я не буду вводить число с минусом ?

И не надо. У вас в условии:

Цитата
Сообщение от Ajhatesyou666
Посмотреть сообщение

Дано натуральное число 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

Получилось что-то такое, но не получается сделать с единицей, выводит что оно простое

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Var K,n,i,b,a: integer;
begin
writeln('Введите число');
readln(a); n:=0;
for i:=1 to a do
if (i mod 2=1)and(a mod i =0) then n:=n+1;
writeln('Количество нечетных делителей числа равно ', n);
k:=0;
for i:=2 to a div 2 do
if a mod i =0 then k:=k+1;
if k=0 then write('простое')
else writeln('не простое');
readln;
end.



0



Get_Over_Here

79 / 49 / 23

Регистрация: 15.07.2018

Сообщений: 255

05.11.2018, 19:08

10

JuriiMW, С числом 4 ваша программа не проходит

Добавлено через 2 минуты
И вообще со всеми числами делящимися на два
Вот поправил немного код JuriiMW:

Pascal
1
2
3
4
5
begin
  var n := ReadInteger;
  WriteLn((Range(1, n, 2) + Range(n, n)).Count(x -> n mod x = 0));
  WriteLn('Простое = ', (n > 1) and ((n = 2) or ((Range(1, n, 2) + Range(n, n)).Count(x -> n mod x = 0) = (odd(n) ? 2 : 1))));
end.

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

Вариант оказался чуточку недоработан, вот доработанный:

Pascal
1
2
3
4
begin
  var n := ReadInteger;
  WriteLn('Простое = ', (n > 1) and ((n = 2) or ((Odd(n) ? Range(1, n, 2).Count(x -> n mod x = 0) : (Range(1, n, 2) + n).Count(x -> n mod x = 0)) = (odd(n) ? 2 : 1))));
end.



0



����:    [

��������� �����. ����� ��������

]
[

��������� �� ���� � ������; �������

]
[

���������� � ����� ��������� �����

]
���������: 3
������: 6,7,8

� �������

�������� �����������

�������

�) �������� 10 ������ ����������� �����, ������� ��ޣ���� ����� ��������� (� ����� ��������� ���������� ������� � ���� �����).

�) ���������� �������������� � �������� �������, ����������� ����� ��������� ����� �����.

�������

�) ��� �������� � ������ 30365, ����������� ����� ����� ��ޣ���� ����� ��������� ����� � ������ �����, ����� ��� �������� ������ ���������.

�����

�) 1, 4, 9, 16, 25, 36, 49, 64, 81, 100.

��������� � ���������� �������������

���������
�������� ������ ��.����������
���/�����
����� 03
���� 1980
������
����� 03

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Valheim как найти босса дракона
  • Как правильно составить официальный ответ
  • Как составить завещание с равными долями наследников
  • Как составить заявку на запрос котировок в электронной форме
  • Как найти конторы незримых

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии