60 lines
1008 B
C++
60 lines
1008 B
C++
#pragma once
|
|
|
|
#include <vector>
|
|
#include <math.h>
|
|
|
|
// Находит все простые множители заданного числа.
|
|
// Простое число - это число > 1, которое делится на 1 и на само себя.
|
|
namespace alg
|
|
{
|
|
inline std::vector<int> prime_factors_v1(int a)
|
|
{
|
|
std::vector<int> result;
|
|
int i = 2;
|
|
|
|
while (i < a)
|
|
{
|
|
while (a%i == 0)
|
|
{
|
|
result.push_back(i);
|
|
a /= i;
|
|
}
|
|
++i;
|
|
}
|
|
|
|
if (a > 1) result.push_back(a);
|
|
|
|
return result;
|
|
}
|
|
|
|
inline std::vector<int> prime_factors_v2(int a)
|
|
{
|
|
std::vector<int> result;
|
|
|
|
while(a%2 == 0)
|
|
{
|
|
result.push_back(2);
|
|
a = a/2;
|
|
}
|
|
|
|
int i = 3;
|
|
int max_faxtor = std::sqrt(a);
|
|
|
|
while (i <= max_faxtor)
|
|
{
|
|
while (a%i == 0)
|
|
{
|
|
result.push_back(i);
|
|
a /= i;
|
|
max_faxtor = std::sqrt(a);
|
|
}
|
|
i += 2;
|
|
}
|
|
|
|
if (a > 1) result.push_back(a);
|
|
|
|
return result;
|
|
}
|
|
|
|
}
|