zoukankan      html  css  js  c++  java
  • 发现的好东西——bitset

    先向各位大佬介绍一个水题

    任何一个正整数都可以用2的幂次方表示。例如

        137=2^7+2^3+2^0         

    同时约定方次用括号来表示,即a^b 可表示为a(b)。

    由此可知,137可表示为:

        2(7)+2(3)+2(0)

    进一步:7= 2^2+2+2^0 (2^1用2表示)

        3=2+2^0   

    所以最后137可表示为:

        2(2(2)+2+2(0))+2(2+2(0))+2(0)

    又如:

        1315=2^10 +2^8 +2^5 +2+1

    所以1315最后可表示为:

        2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

    输入输出格式

    输入格式:

    一个正整数n(n≤20000)。

    输出格式:

    符合约定的n的0,2表示(在表示中不能有空格)

    输入输出样例

    输入样例#1: 复制
    1315
    输出样例#1: 复制
    2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

    作为蒟蒻的我,对这道题表示被括号吓到了,但。。。
    大致思路是这样的
    1315
    1: 1024+256+32+2+1
    //需要位运算的支持(请忽略)
    stack 0 1 5 8 10
    2: 10=2+8
    stack 0 1 5 8 1 3
    stack 0 1 5 8 1 0 1
    if(stack[i]<=1) s.pop(); return i;
    else printf("2(%d)",find(x));

    思路大概是对的,但对于我来说,程序实践又成为了一个问题。

    不打代码都不知道自己原来这么水。orz

    于是我去翻了翻题解

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <bitset>
    using namespace std;
    int n;
    void solve(int x)
    {    
        if(x==1||x==2||x==0)return ;//1,2,0不作分解 
        bitset<32> b=x;//STL大法好啊 
        int sum=b.count(),s=0;//记录何时到最后一位,以便输出"+" 
        for(int i=b.size()-1;~i;--i)//从高阶位遍历 
            if(b[i])//如果是1,则处理 
            {
                s++;//记录已经走过的位数 
                printf("2");
                if(i!=1)printf("(");//只有次幂不为一时输出括号 
                solve(i);//递归 
                //递归输出: 
                if(i==0||i==2)printf("%d",i);//只输出2,0 
    
                if(i!=1)printf(")");
                if(s<sum)printf("+");
            }
    }
    int main()
    {
        cin>>n;
        if(n==1)return printf("2(0)"),0;//特殊点判断 
        if(n==2)return printf("2"),0;
        solve(n);//进入递归 
        return 0;
    }
    
    //作者: 蠢萌_小三爷 (luogu ID) orz

     我觉得bitset这个东西简直太神奇了。

    所以我就去查了查:

        C++语言的一个类库,用来方便地管理一系列的bit位而不用程序员自己来写代码。

        bitset除了可以访问指定下标的bit位以外,还可以把它们作为一个整数来进行某些统计。

                  (人话:定义一串二进制数)

    具体操作:

    定义:

    #include<bitset>
    using namespace std;
    bitset<32> u(s); //32位的u,是s的一个副本 
    bitset<32> u(s,pos,n) //32位的u,是从n开始的s的一个副本
    bitset<32> u; //32位的u,每一位都为0 
    bitset<32> u(0x7ffff)

    和vector的元素一样,bitset中的位是没有命名的,程序员只能按位置来访问它们。位集合的位置编号从0开始,因此,bitvec的位序是从0到31。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)。

    当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。

    在32位unsigned long的机器上,十六进制值0xffff表示为二进制位就是十六个1和十六个0(每个0xf可表示为1111)。可以用0xffff初始化bitset对象

    当用string对象初始化bitset对象时,string对象直接表示为位模式。

    具体函数操作

     to_ulong操作返回一个unsigned long值,该值与bitset对象的位模式存储值相同。仅当bitset类型的长度小于或等于unsigned long的长度时,才可以使用to_ulong操作。

    果然还是好神奇!!!

    ps:本文的部分资料来自

    Liam Q的专栏,各位可以去膜拜原大佬

    连接在此:http://blog.csdn.net/qll125596718/article/details/6901935

  • 相关阅读:
    kindeditor扩展粘贴截图功能&修改图片上传路径并通过webapi上传图片到图片服务器
    解决VS2015 VBCSCompiler.exe 占用CPU100%的问题
    电商网站商品模型之商品详情页设计方案
    大三那年在某宝8块钱买的.NET视频决定了我的职业生涯
    单点登录改进版-使用ajax分发cookie避免重定向轮询
    可跨域的单点登录(SSO)实现方案【附.net代码】
    使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题
    js封装的三级联动菜单(使用时只需要一行js代码)
    EF查询之性能优化技巧
    EF使用CodeFirst方式生成数据库&技巧经验
  • 原文地址:https://www.cnblogs.com/ZDHYXZ/p/7744583.html
Copyright © 2011-2022 走看看