В известной игре в слова нужно составлять слова из букв заданного слова. При этом количество букв в составленном слове не должно превышать количества этих букв в слове-основе. Победителем считается тот, кто составит наибольшее количество слов.
Напишите программу для игры в числа, которая составляет простые числа из цифр заданного числа.
Первая строка ввода содержит одно число
N (1≤N<10^7).
Вывести количество различных простых чисел, которые можно составить из цифр числа N
.

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class Unsigned {
public:
Unsigned() : num(0) {}
Unsigned(const unsigned x) : num(x) {}
unsigned cpn() {
auto range = split(num);
if (isodd(range)) {
unsigned x = 0;
auto max = max_value(range);
for (auto n = 2U; n <= max; ++n) {
if (is_prime(n)) {
auto next = split(n);
vector<unsigned> tmp;
set_intersection(
range.begin(), range.end(),
next.begin(), next.end(),
back_inserter(tmp)
);
if (tmp.size() == next.size()) ++x;
}
}
return x;
}
return find(range.begin(), range.end(), 2) != range.end() ? 1 : 0;
}
private:
unsigned num;
bool is_prime(unsigned x) {
bool prime;
if (x <= 5 && (x <= 2 || x == 3 || x == 5)) prime = true;
else if (~x & 1 || 0 == x % 3 || 0 == x % 5) prime = false;
else {
unsigned n;
for (n = 3; n * n <= x && x % n; n += 2) { ; }
prime = n * n > x? true : false;
}
return prime;
}
vector<unsigned> split(unsigned n) {
static const auto m = 10U;
vector<unsigned> box;
do box.push_back(n % m); while (n /= m);
sort(box.begin(), box.end());
return box;
}
unsigned glue(const vector<unsigned>& box) {
static const auto p = 10U;
if (box.empty()) return 0;
auto n = 0U;
auto w = static_cast<unsigned>(pow(p, box.size()));
for (auto x : box) n += x * (w /= 10);
return n;
}
unsigned max_value(const vector<unsigned>& range) {
auto tmp = range;
sort(tmp.begin(), tmp.end(), greater<>());
return glue(tmp);
}
unsigned isodd(const vector<unsigned>& range) {
auto odd = [](unsigned x) { return x & 1; };
return count_if(range.begin(), range.end(), odd);
}
};
int main() {
unsigned n;
cin >> n;
Unsigned number(n);
cout << number.cpn() << '\n';
system("pause > nul");
}