原题目变长编码: https://www.luogu.com.cn/problem/B3870
using namespace std;
long long n;
string a= "0123456789ABCDEF";
void print(int i){
cout << a[i/16] << a[i%16]<<" ";
}
int main() {
cin >> n;
if (n == 0) { cout << "00"; return 0; }
while (n > 0) {
int k = n % 128; // 取出当前最低的7位
n = n >> 7; // 去掉这7位,相当于右移7位 等价于n/=128
if (n > 0) // 如果还有更高位,说明当前不是最后一组
print(k + 128); // 最高位设为1,即加上128
else
print(k); // 最后一组,最高位为0
}
return 0;
}
n % 128 等价于 n & 127(127 的二进制是 01111111,即低 7 位全 1,最高位 0),因为模 128 运算只保留除以 128 的余数,而 128 是 2^7,所以余数恰好是二进制表示的最低 7 位。例如:
- 数字 926 的二进制:
1110011110(10 位),低 7 位是011110?实际计算:926 ÷ 128 = 7 余 30,余数 30 的二进制是0011110(7 位),正是低 7 位。
因此,n % 128可以方便地取出当前最低的 7 位数值,用于分组.