1 条题解
-
0
解题思路
权重数组初始化:生成一个权重数组 weight,其中每个元素表示某种特殊权重。 整数分解:将输入的整数分解为这些权重的组合。 结果输出:将分解后的结果以特定格式输出,其中每个权重的索引表示为二进制位。
代码分析
权重数组初始化: weight[i] = (1 << (i + 1)) - 1:生成一个权重数组,其中每个权重是 2^(i+1) - 1。 例如,weight[0] = 1,weight[1] = 3,weight[2] = 7,依此类推。 整数分解: 输入整数 a 被分解为多个权重的组合,存储在 skew 数组中。 通过循环从高位到低位依次计算每个权重的贡献。 结果输出: 使用 print 函数将分解后的结果以逗号分隔的形式输出。 flag 用于控制输出格式,确保逗号分隔符正确。
原理
权重数组:权重数组的生成基于二进制数的特殊性质,每个权重表示为 2^(i+1) - 1。 整数分解:通过不断取模和整除操作,将输入整数分解为权重数组的组合。 输出格式:结果以逗号分隔的形式输出,表示每个权重的索引。
实现步骤
初始化权重数组: 使用循环生成权重数组 weight,其中每个元素为 2^(i+1) - 1。 读取输入: 读取测试用例的数量 t,然后依次处理每个测试用例。 分解整数: 对于每个输入整数 a,从高位到低位依次计算每个权重的贡献,存储在 skew 数组中。 输出结果: 使用 print 函数将分解后的结果以逗号分隔的形式输出。 控制输出格式,确保结果符合要求。
#include <bits/stdc++.h> using namespace std; int weight[36]; int skew[36],flag; void print(int x) { if(flag==1) printf(","); printf("%d",x); flag=1; } int main() { for(int i=0;i<30;++i) weight[i]=(1<<(i+1))-1; int t; scanf("%d",&t); while(t--){ int a,b,p=0; scanf("%d",&a); b=a; for(int i=29;i>=0;--i){ skew[p++]=a/weight[i]; a=a%weight[i]; } flag=0; printf("%d [",b); for(int i=p-1;i>=0;--i){ if(skew[i]==1){ print(p-1-i); }else if(skew[i]==2){ print(p-1-i); print(p-1-i); } } puts("]"); } return 0; }
- 1
信息
- ID
- 363
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者