香农:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <bitset>
#include <math.h>
#include <ctype.h>
#include <time.h>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int MAXN = 11000;
double p[MAXN], sump[MAXN], li[MAXN];
int n, LI[MAXN];
char code[MAXN][100];
bool cmp(double a, double b)
{
return a > b;
}
void init()
{
cout << "请依次输入信源符号的概率:";
memset(p, 0, sizeof(p));
memset(sump, 0, sizeof(sump));
for (int i = 1; i <= n; i++)
cin >> p[i];
sort(p + 1, p + 1 + n, cmp);
for (int i = 2; i <= n; i++)
sump[i] = sump[i - 1] + p[i - 1];
}
void solve()
{
for (int i = 1; i <= n; i++)
{
li[i] = (-1)*(log10(p[i]) / log10(2));
LI[i] = ceil(li[i]);
}
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < LI[i]; j++)
{
sump[i] *= 2;
if (sump[i] - 1 >= 0)
{
code[i][j] = '1';
sump[i] -= 1;
}
else
code[i][j] = '0';
}
}
cout