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 @   五月江城  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示