最高效的解法——位运算
2025-10-30 18:36:40
发布于:广东
37阅读
0回复
0点赞
这道题目看着很难,但实现起来很简单,我们可以使用位运算的方式来实现;
首先需要判断这个数的 ,2的次方都是偶数,所以奇数是无法被分解的
if (n % 2 == 1) {
cout << -1 << endl;
return 0;
}
然后就可以进行位运算了,但先要了解背景知识:
这段代码可以将 赋值为 ( 的 次方), 是左移的意思
int power = (1 << n);
因为 之内最大的 的次方是 ( 的 次方),所以我们从大到小遍历,如果 的 次方小于 那么就把 从 中分离出去
for (int i = 30; i >= 1; i--) { // 从大到小遍历, 2 的 27 次方到 2 的 1 次方 ( ( 2 ^ 27 ~ 2 ^ i ) || ( pow( 2 , 27 ) ~ pow( 2 , 1 ) ) )
int power = (1 << i); // 2的次方
if (n >= power) {
cout << power << " ";
n -= power;
}
}
完整代码:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
if (n % 2 == 1) {
cout << -1 << endl;
return 0;
}
for (int i = 30; i >= 1; i--) {
int power = (1 << i);
if (n >= power) {
cout << power << " ";
n -= power;
}
}
return 0;
}
全部评论 2
谢谢大佬!
2025-10-27 来自 福建
1帮我顶顶,谢谢
2025-10-20 来自 广东
0




有帮助,赞一个