这道题其实就是...观察我们对数的二进制的明白,好比5是2的2次方加2的0次方,和5的二进制转十进制是对应的,碰巧5的二进制就是101,以是这是对二进制的一种观察吧。
必须是2的正整数次幂相加才行,那就阐明如果一个数的二进制的最低位是1的话,我们就把它排除了,
- #include <iostream>
- #include <cmath>
- using namespace std;
- int main()
- {
- int n;cin >> n;
- if(n&1) {
- cout << "-1" << endl;
- return 0;
- }
- for(int i = 31;i>=1;i--)
- {
- if((n>>i) &1)
- {
- cout << pow(2,i) << " ";
- }
- }
-
-
-
-
-
- return 0;
- }
复制代码 我第一次写代码的时间写成了如许,但是会有部分测试用例过不了,哦,最后我发现,如果数很大的话,double范例打印的形式是科学计数法的形式,我们可以强转成int就能通过了,固然了,我们也可以选择不消这个pow函数
- #include <iostream>
- #include <cmath>
- using namespace std;
- int main()
- {
- int n;cin >> n;
- if(n&1) {
- cout << "-1" << endl;
- return 0;
- }
- for(int i = 31;i>=1;i--)
- {
- if((n>>i) &1)
- {
- cout << (int)pow(2,i) << " ";
- }
- }
-
-
-
-
-
- return 0;
- }
复制代码 我们也可以用位运算来计算结果
- #include <iostream>
- #include <cmath>
- using namespace std;
- int main()
- {
- int n;cin >> n;
- if(n&1) {
- cout << "-1" << endl;
- return 0;
- }
- for(int i = 31;i>=1;i--)
- {
- if((n>>i) &1)
- {
- cout << (1<<i) << " ";
- }
- }
-
-
-
-
-
- return 0;
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |