题解:P14602 [NWRRC 2025] Compact Encoding

· · 题解

按照题意模拟即可。

先转换为二进制,我是从低位到高位存储的。接下来算出可以分为多少个块,每个块依次再转化为十进制即可。

注意:因为是从低位到高位存储,所以不是最后一个块最高位为 0 了,而是第一个块。并且要倒序输出,我使用的是栈。

还有,特判 n=0 的情况。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ft first
#define sd second
#define fs(i,x,y) for(int i=(x);i<=(y);i++)
#define fj(i,x,y) for(int i=(x);i>=(y);i--)
signed main(){
    std::ios::sync_with_stdio(false);
    cin.tie(0); 
    cout.tie(0);
    int n;
    cin>>n;
    if(n==0){
        cout<<0;
        return 0;
    }
    queue<int>q;
    while(n>0){//转换为二进制。
        q.push(n%2);
        n/=2;
    }
    stack<int>s;
    int l=q.size()/7+(q.size()%7!=0);//计算分成多少块。
    for(int i=1;i<=l;i++){
        int p=1,sum=0;
        for(int j=1;j<=7;j++){
            int k;
            if(!q.empty()){
                k=q.front();
                q.pop();
            }else break;
            sum+=k*p;
            p*=2;
        }
        p=128;
        if(i!=1)sum+=p;
        s.push(sum);
    }
    while(!s.empty()){//倒序输出。
        cout<<s.top()<<' ';
        s.pop();
    }
    return 0;
}