1 条题解

  • 0
    @ 2025-4-7 22:23:14

    解题思路

    权重数组初始化:生成一个权重数组 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
    上传者