Помогите разобраться с фрагментом кода
Программа считает кол-во анаграмм введенного слова (ABCD - 12)
#include <iostream>
#include <string>
unsigned long long fact(int n)
{
if (n == 0 || n == 1)
return 1;
return fact(n - 1) * n;
}
int main()
{
std::string s;
std::cin >> s;
int mas[27] = { 0 };
for (int i = 0; i < s.length(); ++i)
mas[s[i] - 'A']++;
unsigned long long tmp = fact(s.length());
for (int i = 0; i < 27; ++i)
tmp /= fact(mas[i]);
std::cout << tmp;
system("pause");
return 0;
}
Что делает эта строка ?
for (int i = 0; i < s.length(); ++i)
mas[s[i] - 'A']++;
Ответы (1 шт):
Что делает эта строка ?
for (int i = 0; i < s.length(); ++i)
mas[s[i] - 'A']++;
считает, сколько раз встречается каждая уникальная буква в слове
Поскольку букв в английском алфавите 26, то letter - 'A' каждой букве дает свой индекс от 0 до 25, а потом алгоритм анализирует данные по всем буквам
for (int i = 0; i < 27; ++i)
(правда тут не понятно почему взято 28 букв)
А сама программа вычисляет кол-во перестановок с повторениями по формуле
для чего и считает кол-во уникальных букв
P.S.
кстати программа очень неэффективная, поскольку если представить очень большое слово, например
pneumonoultramicroscopicsilicovolcanokoniosis – заболевание лёгких, вызванное вдыханием кремнезема или кварцевой пыли
то необходимо будет вычислить 45! ~ 1,19e+56, который в 64 битное целое (long long) ну никак не влезет
так что предложенный алгоритм способен осилить только 21 буквенные слова
