Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.63 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <Windows.h>//для SetConsoleCP()
  4. using namespace std;
  5. int main()
  6. {
  7.     setlocale(0, "rus");
  8.     string s;
  9.     cout << "Введите строку: ";
  10.     SetConsoleCP(1251);
  11.     getline(cin, s);//считываем строку до ввода Enter
  12.     SetConsoleCP(866);
  13.     int len = s.length();//храним первоначальную длину строки
  14.     float H = 0;//энтропия
  15.     while (s != "")//пока строка не пустая
  16.     {
  17.         int N = 1;//количество символов, равных s[0]
  18.         for (int i = 1; i < s.length(); i++)//пробегаем оставшиеся символы
  19.             if (s[i] == s[0]) {//если встретили равный s[0]
  20.                 N++;//увеличиваем N
  21.                 s.erase(i, 1);//удаляем s[i] из строки (метод erase удаляет 1 символ, начиная с i)
  22.                 i--;//т.к. мы убрали букву на i-м месте, то на её место встала другая. чтобы её обработать, мы специально уходим влево на 1
  23.             }
  24.         float p = (float)N / len;//вероятность
  25.         H += p * log2f(1 / p);//увеличиваем энтропию (прибавляем значение для буквы, стоящей на нулевом месте)
  26.         s = s.erase(0, 1);//удаляем из строки s[0]
  27.         //cout << s << endl;
  28.     }
  29.     cout << "Энтропия равна " << H << endl;
  30.     system("pause");
  31.     return 0;
  32. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement