CSP历年复赛题-P7071 [CSP-J2020] 优秀的拆分

原题链接:https://www.luogu.com.cn/problem/P7071

题意解读:提取n的二进制位所有的1表示的整数,如果最低位是1则输出-1。

解题思路:

如果n的二进制最低为是1(n是奇数),则肯定不是优秀拆分,输出-1

否则,从低位到高位遍历n的每一个二进制位,看第i位是1,倒序输出2^i。

100分代码:

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

int main()
{
    stack<int> res;
    int n;
    cin >> n;
    if(n & 1) cout << -1; //二进制&操作,判断n最低二进制位是否为1
    else
    {
        for(int i = 0; i < 32; i++)
        {
            if(n >> i & 1) //判断n的第i个二进制位是否为1,最低位是0
            {
                res.push(pow(2, i));
            }
        }
    }
    while(res.size())
    {
        cout << res.top() << " ";
        res.pop();
    }
    return 0;
}

另一种方法,直接枚举2^i方,i从30~1,看n是否够减,够减则输出,n -= 2*i

100分代码:

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

int main()
{
    int n;
    cin >> n;
    if(n % 2) cout << -1; 
    else
    {
        for(int i = 30; i >= 1; i--)
        {
            int x = pow(2, i);
            if(n >= x)
            {
                cout << x << " ";
                n -= x;
            }
        }
    }
    return 0;
}

 

posted @ 2024-06-13 10:30  五月江城  阅读(106)  评论(0编辑  收藏  举报