【题解】 [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;
}