Есть число 2098216. Надо найти количество трехзначных чисел, которые можно создать из цифр этого числа, т.е. 209, 982, 821, 216.
Можно ли это сделать с помощью алгоритма next_premutation? Если нет, то помогите найти другой метод.
идея алгоритма - рассматриваем число наоборот, каждый раз показывая последние три цифры и отбрасывая последнюю
#include <iostream>
using namespace std;
int calc(int n)
{
int total = 0;
while (n > 99) {
int c = n % 1000;
if (c > 99) {
cout << c << endl; // закоментировать, если числа не нужны
total++;
}
n = n / 10;
}
return total;
}
int main() {
int n = 2098216;
cout << "total " << calc(n) << endl;
return 0;
}
Эту же задачу можно решить и через строковое представление, но мне кажется, это будет переусложнение.
Есть число 2098216. Надо найти количество трехзначных чисел, которые можно создать из цифр этого числа, т.е. 209, 982, 821, 216
Все гораздо проще. Если бы не цифра "нуль", то можно было бы вычислять "выборку с возвращением". В данном же случае можно поступить так:
#include <algorithm>
#include <iostream>
int Calc3(int D) {
int V[10] = {0};
for(;D>0;D/=10) V[D%10]=1;
int N = std::accumulate(std::begin(V),std::end(V),0);
return (N-V[0])*N*N;
}
int main () {
std::cout << Calc3(2098216) << std::endl;
return 0;
}
Вывод:
180
На ideone.
Объяснение решения
Вывод: число комбинаций равно (N-1) * N * N
Сборка персонального компьютера от Artline: умный выбор для современных пользователей