Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <Windows.h>//для SetConsoleCP()
- using namespace std;
- int main()
- {
- setlocale(0, "rus");
- string s;
- cout << "Введите строку: ";
- SetConsoleCP(1251);
- getline(cin, s);//считываем строку до ввода Enter
- SetConsoleCP(866);
- int len = s.length();//храним первоначальную длину строки
- float H = 0;//энтропия
- while (s != "")//пока строка не пустая
- {
- int N = 1;//количество символов, равных s[0]
- for (int i = 1; i < s.length(); i++)//пробегаем оставшиеся символы
- if (s[i] == s[0]) {//если встретили равный s[0]
- N++;//увеличиваем N
- s.erase(i, 1);//удаляем s[i] из строки (метод erase удаляет 1 символ, начиная с i)
- i--;//т.к. мы убрали букву на i-м месте, то на её место встала другая. чтобы её обработать, мы специально уходим влево на 1
- }
- float p = (float)N / len;//вероятность
- H += p * log2f(1 / p);//увеличиваем энтропию (прибавляем значение для буквы, стоящей на нулевом месте)
- s = s.erase(0, 1);//удаляем из строки s[0]
- //cout << s << endl;
- }
- cout << "Энтропия равна " << H << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement