题解:P14602 [NWRRC 2025] Compact Encoding
按照题意模拟即可。
先转换为二进制,我是从低位到高位存储的。接下来算出可以分为多少个块,每个块依次再转化为十进制即可。
注意:因为是从低位到高位存储,所以不是最后一个块最高位为
还有,特判
代码
#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;
}