注意审题这里有一个坑,2的零次方 算优秀吗?当然不算,应为他说的是正整数次幂。
【分析】
1、首先n一定不能是奇数。
2、剩下就是将n拆成2的幂,主要策略是从大到小尝试每一个2的正整数次幂,如果n≥2i ,那么n就可以被拆分为2i和n−2i,然后更新n的值n−2i,继续尝试下一个2的正整数次幂。
方法一:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n; cin>>n;
if(n % 2 == 1) return cout<<-1, 0;
n /= 2;
vector<int> ans;
//将n转换成二进制,如果在二进制的某一位上为1,则将对应的2的i次方存进数组中
for(int i = 2; n; i *= 2){
if(n % 2 == 1) ans.push_back(i);
n /= 2;
}
//反转数组,达到逆序输出的效果
reverse(ans.begin(), ans.end());
for(int a : ans) cout<<a<<' ';
return 0;
}
方法二:
#include <bits/stdc++.h>
using namespace std;
int solve(int n) { // 奇数不能被拆分成若干个不同的2的正整数次幂
if (n % 2) return puts("-1");
int p = 1;
while (p * 2 <= n) p *= 2;
while (p >= 2) { // p是2的幂
if (n >= p) n -= p, printf("%d ", p); // 如果 n≥p,拆分为 p 和 n-p
p /= 2;
}
return puts(""); // 换行
}
int main() {
for (int n; cin >> n;) solve(n);
return 0;
}