UVA Live 5911:Binary Encoding

题目描述:

题目中给出了Truncated binary encoding的一些限制,比如对于0~m-1以内的所有编码,总长度是最小的,n-1位的编码不能是n位编码的前缀,而且每一个编码都是不同的。在m是二进制幂的时候,Truncated binary encoding与二进制码相同。

大致思路:

Truncated binary encoding跟数字上限m是有关系的,m不同的时候,编码可能不同。我们对于每一个上限n,定义k和u,2^k ≤ n < 2^(k+1) and let u = 2^(k+1) - n。根据编码规则可以知道,前u个编码长度应该是k,而剩下的n-u个编码长度是k+1。因为长度是k+1的编码会包含所有长度k的编码为前缀。所以编码就应该是从0开始的u个数字采用二进制编码,剩下的采用x+u的编码。

代码:

#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

int u,k;

string Binary (int x, int len) {
    string s = "";
    while (x != 0) {
        if (x % 2 == 0)  s = '0' + s;
        else  s = '1' + s;
        x >>= 1;
    }
    while (s.length() < len)  s = '0' + s;
    return s;
}

string TruncatedBinary (int x) {
    if (x < u) return Binary(x, k);
    else return Binary(x+u, k+1);
}

int main() {
    int m;
    while (cin>>m) {
        int tmp = m;
        k = 0;
        while (tmp > 1) {
            k++;
            tmp >>= 1;
        }
        u = (1 << k+1) - m;
        for (int i = 0; i < m; i++) {
            cout<<TruncatedBinary(i)<<endl;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值