1 条题解

  • 0
    @ 2026-10-2 0:54:02

    题意

    给定一个不大于10710^7的正整数,将其拆分成若干个2的正整数次幂的和,然后从大到小输出。如果做不到就输出-1.

    解题思路

    首先可以发现,如果这个数是奇数,那么它拆分的结果中一定有1,一定不存在优秀的拆分;反之,如果是偶数就一定存在。 2的若干次幂可以用二进制中的某一位为1其余位为0来表示,比如8是232^3,其二进制表示是1000,可以发现只有第4位是1。6可以拆分为4+2,其二进制表示是110,可以发现2的不同次幂的数相加在一起在二进制表达里不会产生进位。因此我们只需要知道输入的数用二进制表示时哪些位是1,再把仅有这一位是1的二进制数转为十进制数输出即可。

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int i,c=8388608;cin>>i;//8388608是比10^7小的最大的2的正整数次幂
        if(i&1)cout<<-1;
        else{
            while(c>1){
                if(i&c)cout<<c<<' ';
                c>>=1;
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    2220
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    3
    上传者