【题解】 [CSP-J 2020 T1] 优秀的拆分

题目描述

题目大意

判断整数 \(n\) 能否被分解为了若干个不同的 \(2\) 的正整数次幂:

  • 能:输出拆分方案。
  • 不能:输出 -1

思路

题目主要考察:位运算
如果整数 \(n\) 不满足题目的拆分条件(拆分方案中不包含 \(2^0\)),那么当且仅当 \(n\) 二进制尾位为 \(1\),即 \(n\) 为奇数。
如果满足题目的拆分条件,那么就将整数 \(n\) 的二进制逐位扫描,记录为 \(1\) 的位。

代码

#include <bits/stdc++.h>
using namespace std;

int n;
vector<int> ans; // 记录拆分方案

int main()
{
    scanf("%d", &n);

    if (n % 2 == 1) // 如果 n 不满足拆分条件,即 n 为奇数
    {
        puts("-1"); // 输出 -1
        return 0;
    }

    int num = 1; // num 用于记录当前位所对应的权值
    for (int i = n; i; i >>= 1, num <<= 1) // i 每次右移一位,num 所对应的权值就会 乘2
        if (i & 1) // 如果 当前位 为1
            ans.push_back(num); // 记录权值

    for (int i = ans.size() - 1; i >= 0; i -- ) // 由于ans从小到大储存,所以反向输出
        printf("%d ", ans[i]);

    return 0;
}
posted @ 2024-06-24 19:46  T_泓  阅读(103)  评论(0编辑  收藏  举报