Онлайн калькулятор поможет вычислить сумму простых делителей числа, выпишет все делители, число положительных делителей натурального числа.
Сумма простых делителей числа |
|
Число | |
|
|
Разделитель групп разрядов
Округлить до
Число прописью
Скачать калькулятор
Рейтинг: 3.2 (Голосов 22)
×
Пожалуйста напишите с чем связна такая низкая оценка:
×
Для установки калькулятора на iPhone – просто добавьте страницу
«На главный экран»
Для установки калькулятора на Android – просто добавьте страницу
«На главный экран»
Сообщить об ошибке
Смотрите также
Неполное частное | Деление столбиком | Округление чисел | Количество разрядов в числе |
Найти делимое | Все делители числа | Деление с остатком | Выгодность пиццы |
Given a number N. The task is to find the sum of all the prime divisors of N.
Examples:
Input: 60 Output: 10 2, 3, 5 are prime divisors of 60 Input: 39 Output: 16 3, 13 are prime divisors of 39
A naive approach will be to iterate for all numbers till N and check if the number divides N. If the number divides N, check if that number is prime or not. Add all the prime numbers till N which divides N.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using
namespace
std;
#define N 1000005
bool
isPrime(
int
n)
{
if
(n <= 1)
return
false
;
if
(n <= 3)
return
true
;
if
(n % 2 == 0 || n % 3 == 0)
return
false
;
for
(
int
i = 5; i * i <= n; i = i + 6)
if
(n % i == 0 || n % (i + 2) == 0)
return
false
;
return
true
;
}
int
SumOfPrimeDivisors(
int
n)
{
int
sum = 0;
for
(
int
i = 1; i <= n; i++) {
if
(n % i == 0) {
if
(isPrime(i))
sum += i;
}
}
return
sum;
}
int
main()
{
int
n = 60;
cout <<
"Sum of prime divisors of 60 is "
<< SumOfPrimeDivisors(n) << endl;
}
C
#include <stdio.h>
#include <stdbool.h>
#define N 1000005
bool
isPrime(
int
n)
{
if
(n <= 1)
return
false
;
if
(n <= 3)
return
true
;
if
(n % 2 == 0 || n % 3 == 0)
return
false
;
for
(
int
i = 5; i * i <= n; i = i + 6)
if
(n % i == 0 || n % (i + 2) == 0)
return
false
;
return
true
;
}
int
SumOfPrimeDivisors(
int
n)
{
int
sum = 0;
for
(
int
i = 1; i <= n; i++) {
if
(n % i == 0) {
if
(isPrime(i))
sum += i;
}
}
return
sum;
}
int
main()
{
int
n = 60;
printf
(
"Sum of prime divisors of 60 is %dn"
,SumOfPrimeDivisors(n));
}
Java
import
java.io.*;
import
java.util.*;
class
GFG
{
static
boolean
isPrime(
int
n)
{
if
(n <=
1
)
return
false
;
if
(n <=
3
)
return
true
;
if
(n %
2
==
0
|| n %
3
==
0
)
return
false
;
for
(
int
i =
5
;
i * i <= n; i = i +
6
)
if
(n % i ==
0
||
n % (i +
2
) ==
0
)
return
false
;
return
true
;
}
static
int
SumOfPrimeDivisors(
int
n)
{
int
sum =
0
;
for
(
int
i =
1
;
i <= n; i++)
{
if
(n % i ==
0
)
{
if
(isPrime(i))
sum += i;
}
}
return
sum;
}
public
static
void
main(String args[])
{
int
n =
60
;
System.out.print(
"Sum of prime divisors of 60 is "
+
SumOfPrimeDivisors(n) +
"n"
);
}
}
C#
using
System;
class
GFG
{
static
bool
isPrime(
int
n)
{
if
(n <= 1)
return
false
;
if
(n <= 3)
return
true
;
if
(n % 2 == 0 || n % 3 == 0)
return
false
;
for
(
int
i = 5;
i * i <= n; i = i + 6)
if
(n % i == 0 ||
n % (i + 2) == 0)
return
false
;
return
true
;
}
static
int
SumOfPrimeDivisors(
int
n)
{
int
sum = 0;
for
(
int
i = 1;
i <= n; i++)
{
if
(n % i == 0)
{
if
(isPrime(i))
sum += i;
}
}
return
sum;
}
public
static
void
Main()
{
int
n = 60;
Console.WriteLine(
"Sum of prime divisors of 60 is "
+
SumOfPrimeDivisors(n) +
"n"
);
}
}
Python3
N
=
1000005
def
isPrime(n):
if
n <
=
1
:
return
False
if
n <
=
3
:
return
True
if
n
%
2
=
=
0
or
n
%
3
=
=
0
:
return
False
i
=
5
while
i
*
i <
=
n:
if
(n
%
i
=
=
0
or
n
%
(i
+
2
)
=
=
0
):
return
False
i
=
i
+
6
return
True
def
SumOfPrimeDivisors(n):
sum
=
0
for
i
in
range
(
1
, n
+
1
) :
if
n
%
i
=
=
0
:
if
isPrime(i):
sum
+
=
i
return
sum
n
=
60
print
(
"Sum of prime divisors of 60 is "
+
str
(SumOfPrimeDivisors(n)))
PHP
<?php
$N
= 1000005;
function
isPrime(
$n
)
{
global
$N
;
if
(
$n
<= 1)
return
false;
if
(
$n
<= 3)
return
true;
if
(
$n
% 2 == 0 ||
$n
% 3 == 0)
return
false;
for
(
$i
= 5;
$i
*
$i
<=
$n
;
$i
=
$i
+ 6)
if
(
$n
%
$i
== 0 ||
$n
% (
$i
+ 2) == 0)
return
false;
return
true;
}
function
SumOfPrimeDivisors(
$n
)
{
$sum
= 0;
for
(
$i
= 1;
$i
<=
$n
;
$i
++)
{
if
(
$n
%
$i
== 0)
{
if
(isPrime(
$i
))
$sum
+=
$i
;
}
}
return
$sum
;
}
$n
= 60;
echo
"Sum of prime divisors of 60 is "
.
SumOfPrimeDivisors(
$n
);
?>
Javascript
<script>
let N = 1000005;
function
isPrime(n)
{
if
(n <= 1)
return
false
;
if
(n <= 3)
return
true
;
if
(n % 2 == 0 || n % 3 == 0)
return
false
;
for
(let i = 5; i * i <= n; i = i + 6)
if
(n % i == 0 || n % (i + 2) == 0)
return
false
;
return
true
;
}
function
SumOfPrimeDivisors(n)
{
let sum = 0;
for
(let i = 1; i <= n; i++) {
if
(n % i == 0) {
if
(isPrime(i))
sum += i;
}
}
return
sum;
}
let n = 60;
document.write(
"Sum of prime divisors of 60 is "
+SumOfPrimeDivisors(n));
</script>
Output
Sum of prime divisors of 60 is 10
Time Complexity: O(N * sqrt(N))
Efficient Approach: The complexity can be reduced using Sieve of Eratosthenes with some modifications. The modifications are as follows:
- Take an array of size N and substitute zero in all the indexes(initially consider all the numbers are prime).
- Iterate for all the numbers whose indexes have zero(i.e., it is prime numbers).
- Add this number to all it’s multiples less than N
- Return the array[N] value which has the sum stored in it.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using
namespace
std;
int
Sum(
int
N)
{
int
SumOfPrimeDivisors[N+1] = { 0 };
for
(
int
i = 2; i <= N; ++i) {
if
(!SumOfPrimeDivisors[i]) {
for
(
int
j = i; j <= N; j += i) {
SumOfPrimeDivisors[j] += i;
}
}
}
return
SumOfPrimeDivisors[N];
}
int
main()
{
int
N = 60;
cout <<
"Sum of prime divisors of 60 is "
<< Sum(N) << endl;
}
Java
import
java.io.*;
import
java.util.*;
class
GFG
{
static
int
Sum(
int
N)
{
int
SumOfPrimeDivisors[] =
new
int
[N +
1
];
for
(
int
i =
2
; i <= N; ++i)
{
if
(SumOfPrimeDivisors[i] ==
0
)
{
for
(
int
j = i; j <= N; j += i)
{
SumOfPrimeDivisors[j] += i;
}
}
}
return
SumOfPrimeDivisors[N];
}
public
static
void
main(String args[])
{
int
N =
60
;
System.out.print(
"Sum of prime "
+
"divisors of 60 is "
+
Sum(N) +
"n"
);
}
}
Python3
def
Sum
(N):
SumOfPrimeDivisors
=
[
0
]
*
(N
+
1
)
for
i
in
range
(
2
, N
+
1
) :
if
(SumOfPrimeDivisors[i]
=
=
0
) :
for
j
in
range
(i, N
+
1
, i) :
SumOfPrimeDivisors[j]
+
=
i
return
SumOfPrimeDivisors[N]
N
=
60
print
(
"Sum of prime"
,
"divisors of 60 is"
,
Sum
(N));
C#
using
System;
class
GFG
{
static
int
Sum(
int
N)
{
int
[]SumOfPrimeDivisors =
new
int
[N + 1];
for
(
int
i = 2; i <= N; ++i)
{
if
(SumOfPrimeDivisors[i] == 0)
{
for
(
int
j = i;
j <= N; j += i)
{
SumOfPrimeDivisors[j] += i;
}
}
}
return
SumOfPrimeDivisors[N];
}
public
static
void
Main()
{
int
N = 60;
Console.Write(
"Sum of prime "
+
"divisors of 60 is "
+
Sum(N) +
"n"
);
}
}
PHP
<?php
function
Sum(
$N
)
{
for
(
$i
= 0;
$i
<=
$N
;
$i
++)
$SumOfPrimeDivisors
[
$i
] = 0;
for
(
$i
= 2;
$i
<=
$N
; ++
$i
)
{
if
(!
$SumOfPrimeDivisors
[
$i
])
{
for
(
$j
=
$i
;
$j
<=
$N
;
$j
+=
$i
)
{
$SumOfPrimeDivisors
[
$j
] +=
$i
;
}
}
}
return
$SumOfPrimeDivisors
[
$N
];
}
$N
= 60;
echo
"Sum of prime divisors of 60 is "
. Sum(
$N
);
?>
Javascript
<script>
function
Sum(N)
{
let SumOfPrimeDivisors =
new
Array(N+1);
for
(let i=0;i<SumOfPrimeDivisors.length;i++)
{
SumOfPrimeDivisors[i]=0;
}
for
(let i = 2; i <= N; ++i)
{
if
(SumOfPrimeDivisors[i] == 0)
{
for
(let j = i; j <= N; j += i)
{
SumOfPrimeDivisors[j] += i;
}
}
}
return
SumOfPrimeDivisors[N];
}
let N = 60;
document.write(
"Sum of prime "
+
"divisors of 60 is "
+
Sum(N) +
"<br>"
);
</script>
Output
Sum of prime divisors of 60 is 10
Time Complexity: O(N * log N)
Efficient Approach:
Time complexity can be reduced by finding all the factors efficiently. Below approach describe how to find all the factors efficiently. If we look carefully, all the divisors are present in pairs. For example if n = 100, then the various pairs of divisors are: (1,100), (2,50), (4,25), (5,20), (10,10) Using this fact we could speed up our program significantly. We, however, have to be careful if there are two equal divisors as in the case of (10, 10). In such case, we’d take only one of them.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using
namespace
std;
bool
isPrime(
int
n)
{
if
(n <= 1)
return
false
;
if
(n <= 3)
return
true
;
if
(n % 2 == 0 || n % 3 == 0)
return
false
;
for
(
int
i = 5; i * i <= n; i = i + 6)
if
(n % i == 0 || n % (i + 2) == 0)
return
false
;
return
true
;
}
int
SumOfPrimeDivisors(
int
n)
{
int
sum = 0;
int
root_n = (
int
)
sqrt
(n);
for
(
int
i = 1; i <= root_n; i++) {
if
(n % i == 0) {
if
(i == n / i && isPrime(i)) {
sum += i;
}
else
{
if
(isPrime(i)) {
sum += i;
}
if
(isPrime(n / i)) {
sum += (n / i);
}
}
}
}
return
sum;
}
int
main()
{
int
n = 60;
cout <<
"Sum of prime divisors of 60 is "
<< SumOfPrimeDivisors(n) << endl;
}
C
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
bool
isPrime(
int
n)
{
if
(n <= 1)
return
false
;
if
(n <= 3)
return
true
;
if
(n % 2 == 0 || n % 3 == 0)
return
false
;
for
(
int
i = 5; i * i <= n; i = i + 6)
if
(n % i == 0 || n % (i + 2) == 0)
return
false
;
return
true
;
}
int
SumOfPrimeDivisors(
int
n)
{
int
sum = 0;
int
root_n = (
int
)
sqrt
(n);
for
(
int
i = 1; i <= root_n; i++) {
if
(n % i == 0) {
if
(i == n / i && isPrime(i)) {
sum += i;
}
else
{
if
(isPrime(i)) {
sum += i;
}
if
(isPrime(n / i)) {
sum += (n / i);
}
}
}
}
return
sum;
}
int
main()
{
int
n = 60;
printf
(
"Sum of prime divisors of 60 is %dn"
,SumOfPrimeDivisors(n));
}
Java
class
GFG{
static
boolean
isPrime(
int
n)
{
if
(n <=
1
)
return
false
;
if
(n <=
3
)
return
true
;
if
(n %
2
==
0
|| n %
3
==
0
)
return
false
;
for
(
int
i =
5
; i * i <= n; i = i +
6
)
if
(n % i ==
0
|| n % (i +
2
) ==
0
)
return
false
;
return
true
;
}
static
int
SumOfPrimeDivisors(
int
n)
{
int
sum =
0
;
int
root_n = (
int
)Math.sqrt(n);
for
(
int
i =
1
; i <= root_n; i++)
{
if
(n % i ==
0
)
{
if
(i == n / i && isPrime(i))
{
sum += i;
}
else
{
if
(isPrime(i))
{
sum += i;
}
if
(isPrime(n / i))
{
sum += (n / i);
}
}
}
}
return
sum;
}
public
static
void
main(String[] args)
{
int
n =
60
;
System.out.println(
"Sum of prime divisors of 60 is "
+
SumOfPrimeDivisors(n));
}
}
Python3
import
math
def
isPrime(n) :
if
(n <
=
1
) :
return
False
if
(n <
=
3
) :
return
True
if
(n
%
2
=
=
0
or
n
%
3
=
=
0
) :
return
False
i
=
5
while
i
*
i <
=
n :
if
(n
%
i
=
=
0
or
n
%
(i
+
2
)
=
=
0
) :
return
False
i
=
i
+
6
return
True
def
SumOfPrimeDivisors(n) :
Sum
=
0
root_n
=
(
int
)(math.sqrt(n))
for
i
in
range
(
1
, root_n
+
1
) :
if
(n
%
i
=
=
0
) :
if
(i
=
=
(
int
)(n
/
i)
and
isPrime(i)) :
Sum
+
=
i
else
:
if
(isPrime(i)) :
Sum
+
=
i
if
(isPrime((
int
)(n
/
i))) :
Sum
+
=
(
int
)(n
/
i)
return
Sum
n
=
60
print
(
"Sum of prime divisors of 60 is"
, SumOfPrimeDivisors(n))
C#
using
System;
class
GFG {
static
bool
isPrime(
int
n)
{
if
(n <= 1)
return
false
;
if
(n <= 3)
return
true
;
if
(n % 2 == 0 || n % 3 == 0)
return
false
;
for
(
int
i = 5; i * i <= n; i = i + 6)
if
(n % i == 0 || n % (i + 2) == 0)
return
false
;
return
true
;
}
static
int
SumOfPrimeDivisors(
int
n)
{
int
sum = 0;
int
root_n = (
int
)Math.Sqrt(n);
for
(
int
i = 1; i <= root_n; i++) {
if
(n % i == 0) {
if
(i == n / i && isPrime(i)) {
sum += i;
}
else
{
if
(isPrime(i)) {
sum += i;
}
if
(isPrime(n / i)) {
sum += (n / i);
}
}
}
}
return
sum;
}
static
void
Main() {
int
n = 60;
Console.WriteLine(
"Sum of prime divisors of 60 is "
+ SumOfPrimeDivisors(n));
}
}
Javascript
<script>
function
isPrime(n)
{
if
(n <= 1)
return
false
;
if
(n <= 3)
return
true
;
if
(n % 2 == 0 || n % 3 == 0)
return
false
;
for
(let i = 5; i * i <= n; i = i + 6)
if
(n % i == 0 || n % (i + 2) == 0)
return
false
;
return
true
;
}
function
SumOfPrimeDivisors(n)
{
let sum = 0;
let root_n = parseInt(Math.sqrt(n), 10);
for
(let i = 1; i <= root_n; i++) {
if
(n % i == 0) {
if
(i == parseInt(n / i, 10) && isPrime(i)) {
sum += i;
}
else
{
if
(isPrime(i)) {
sum += i;
}
if
(isPrime(parseInt(n / i, 10))) {
sum += (parseInt(n / i, 10));
}
}
}
}
return
sum;
}
let n = 60;
document.write(
"Sum of prime divisors of 60 is "
+ SumOfPrimeDivisors(n) +
"</br>"
);
</script>
Output
Sum of prime divisors of 60 is 10
Time Complexity: O(sqrt(N) * sqrt(N))
Approach#4: Using filter, lambda, map
This approach defines two functions is_prime(n) and prime_divisor_sum(n) to determine whether a number is prime or not and to find the sum of all prime divisors of a number, respectively. The is_prime(n) function is used to filter out non-prime divisors using the filter() function inside prime_divisor_sum(n). Finally, the sum() function is used, to sum up all the prime divisors of the given number.
Algorithm
1. Define the function is_prime(n) to check if a number is prime or not. It returns True if the given number is prime, and False otherwise.
2. Define the function prime_divisor_sum(n) to find the sum of all prime divisors of the given number.
3. Use the filter() function inside prime_divisor_sum(n) to filter out all non-prime divisors from the range of 2 to n using a lambda function that checks if a number is a prime divisor of n.
4. Use the map() function to create an iterator that returns each element of the filtered iterator. The lambda function lambda x: x is used as the mapping function. It simply returns its input argument.
5. Finally, use the sum() function to sum up all the elements of the mapped iterator, giving the sum of all prime divisors of n.
Python3
def
is_prime(n):
if
n <
=
1
:
return
False
for
i
in
range
(
2
,
int
(n
*
*
0.5
)
+
1
):
if
n
%
i
=
=
0
:
return
False
return
True
def
prime_divisor_sum(n):
divisors
=
filter
(
lambda
x: n
%
x
=
=
0
and
is_prime(x),
range
(
2
, n
+
1
))
return
sum
(
map
(
lambda
x: x, divisors))
n
=
60
print
(prime_divisor_sum(n))
Time complexity: O(sqrt(n)), as it checks all numbers from 2 to sqrt(n) to see if n is divisible by any of them. The time complexity of the filter() function is also O(sqrt(n)), as it applies the lambda function to each number from 2 to n and returns an iterator of prime divisors. The time complexity of the map() function is O(k), where k is the number of elements in the filtered iterator. The time complexity of the sum() function is O(k), where k is the number of elements in the mapped iterator. Therefore, the overall time complexity of the code is O(sqrt(n) + k).
Space complexity: O(k), where k is the number of prime divisors of n, since we store them in the filtered and mapped iterators.
Last Updated :
27 Apr, 2023
Like Article
Save Article
Число и сумма натуральных делителей натурального числа
Основная теорема арифметики. Всякое натуральное число п > 1 либо просто, либо может быть представлено, и притом единственным образом – с точностью до порядка следования сомножителей, в виде произведения простых чисел (можно считать, что любое натуральное число, большее 1, можно представить в виде произведения простых чисел, если считать , что это произведение может содержать всего лишь один множитель).
Среди простых сомножителей, присутствующих в разложении `n = p1*p2*…*pk`, могут быть и одинаковые. Например, `24=2*2*2*3`. Их можно объединить, воспользовавшись операцией возведения в степень. Кроме того, простые сомножители можно упорядочить по величине. В результате получается разложение
`n = p_1^(alpha_1)*p_2^(alpha_2)*…….*p_k^(alpha_k)`, где `alpha_1, alpha_2, ……, alpha_k in NN`
(1)
Такое представление числа называется каноническим разложением его на простые сомножители. Например, каноническое представление числа 2 520 имеет вид 2 520 = 23 • З2 • 5 • 7.
Из канонического разложения числа легко можно вывести следующую лемму: Если n имеет вид (1), то , то все делители этого числа имеют вид:
`d = p_1^(beta_1)*p_2^(beta_2)*……*p_k^(beta^k)`, где `0 <= beta_m <= alpha_m` ( `m = 1,2,…, k`)
(2)
В самом деле, очевидно, что всякое d вида (2) делит а. Обратно, пусть d делит а, тогда a=cd, где с — некоторое натуральное число и, следовательно, все простые делители числа d входят в каноническое разложение числа а с показателями, не превышающими соответствующих показателей числа а.
Рассмотрим две функции, заданные на множестве натуральных чисел:
а) τ(n) – число всех натуральных делителей n;
2) σ(n) сумма всех натуральных делителей числа n.
Пусть n имеет каноническое разложение (1). Выведем формулы для числа и суммы его его натуральных делителей.
Теорема 1. Число натуральных делителей числа n
`tau(n) = (alpha_1 + 1)*(alpha_2 + 1)*…..*(alpha_k + 1);`
(3)
Доказательство.
читать дальше
Пример. Число 2 520 = 23 • З2 • 5 • 7. имеет (3+1)(2+1)(1+1)(1+1) = 48 делителей.
Теорема 2. Пусть n имеет каноническое разложение (1). Тогда сумма натуральных делителей числа n равна
`sigma(n) = (1 + p_1 + p_1^2 + ….. + p_1^(alpha_1))*(1 + p_2 + p_2^2 + ….. + p_2^(alpha_2))* …………..* (1 + p_k + p_k^2 + …..+ p_k^(alpha_k));`
(4)
Доказательство.
читать дальше
Пример. Найти сумму всех делителей числа 90.
90=2 • З2 • 5. Тогда σ(90)=[(22-1)/(2-1)]• [З3-1)/(3-1)]• [(52-1)/(5-1)]=234
Формула (4) может помочь найти все делители числа.Так, например, чтобы найти все делители числа 90, раскроем скобки в следующем произведении (не производя операцию сложения): (1+2)(1+3+З2)(1+5)=(1+1*3+1*З2+1*2+2*3+2*З2)(1+5) = 1+3+З2+2+2*3+2*З2+ 5+3*5+З2*5+2*5+2*3*5+2*З2*5 = 1+3+9+2+6+18+5+15+45+10+30+90 – слагаемыми являются делители числа 90.
Решим несколько задач на тему “Число и сумма натуральных делителей натурального числа”
Задание 1. Найдите натуральное число, зная, что оно имеет только два простых делителя, что число всех делителей равно 6, а сумма всех делителей — 28.
Решение
Задания из сборника TTZ – ЕГЭ 2010. Математика. Типовые тестовые задания
Задание 2. TTZ.С6.2 Найдите все натуральные числа, которые делятся на 42 и имеют ровно 42 различных натуральных делителя (включая единицу и само число).
Решение
Задание 3. TTZ.С6.9 Найдите все натуральные числа, последняя десятичная цифра которых 0 и которые имеют ровно 15 различных натуральных делителей(включая единицу и само число).
Решение
Задание 4. SPI.С6.9. У натурального числа n ровно 6 делителей. Сумма этих делителей равна 3500. Найти n.
Решение VEk:
Решение
Задания для самостоятельной работы
SR1. Найти все числа, имеющие ровно 2 простых делителя, всего 8 делителей, сумма которых равна 60.
SR2. Найти натуральные числа, которые делятся на 3 и на 4 и имеют ровно 21 натуральный делитель.
SR3. Найти наименьшее натуральное число, имеющее ровно 18 натуральных делителей.
SR4. Найти наименьшее число, кратное 5, имеющее 18 натуральных делителей.
SR5. Некоторое натуральное число имеет два простых делителя. Его квадрат имеет всего 15 делителей. Сколько делителей имеет куб этого числа?
SR6. Некоторое натуральное число имеет два простых делителя. Его квадрат имеет всего 81 делитель. Сколько делителей имеет куб этого числа?
SR7. Найти число вида m = 2x3y5z, зная, что половина его имеет на 30 делителей меньше, треть —на 35 и пятая часть — на 42 делителя меньше, чем само число.
Топик поднят, поскольку по теме топика постоянно появляются вопросы.