• 剑指OFFER之二进制中1的个数


    题目描述:

    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

    输入:

    输入可能包含多个测试样例。
    对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
    。n保证是int范围内的一个整数。

    输出:

    对应每个测试案例,
    输出一个整数,代表输入的那个数中1的个数。

    样例输入:
    3
    4
    5
    -1
    样例输出:
    1
    2
    32

    Code:
    #include <iostream>
    #include <stdio.h>
     
    using namespace std;
     
    int count_1(int test){
        int ans=0;
        for(int i=0;i<=31;i++){
            if(test&1)
                ans++;
            test=test>>1;
        }
        return ans;
    }
     
    int main()
    {
        int T;
        while(scanf("%d",&T)!=EOF){
            for(int i=1;i<=T;i++){
                int x;
                scanf("%d",&x);
                printf("%d
    ",count_1(x));
            }
        }
        return 0;
    }
    /**************************************************************
        Problem: 1513
        User: lcyvino
        Language: C++
        Result: Accepted
        Time:80 ms
        Memory:1520 kb
    ****************************************************************/

    之前没用过移位操作符,因为计算机自身对有符号数的编码就是采用补码的方式,所以不用自己转换。

    一道类似的题目:

    题目描述:

    给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形式经过循环左移若干位而得到。

    循环左移和普通左移的区别在于:最左边的那一位经过循环左移一位后就会被移到最右边去。比如:
    1011 0000 0000 0001 经过循环左移一位后,变成 0110 0000 0000 0011, 若是循环左移2位,则变成 1100 0000 0000 0110

    输入:

    第一行是个整数n, 0 < n < 300000,表示后面还有n行数据
    后面是n行,每行有两个不大于65535的非负整数

    输出:

    对于每一行的两个整数,输出一行,内容为YES或NO

    样例输入:
    4
    2 4
    9 18
    45057 49158
    7 12
    样例输出:
    YES
    YES
    YES
    NO

    Code:
    #include <iostream>
     
    using namespace std;
     
    bool check(unsigned short a,unsigned short b){
        int cnt=1;
        while(cnt<=16){
            if(a==b)
                return true;
            int flag=0;
            if((a&0x8000)==0x8000)    //注意:'=='的优先级要高于'&'  这就是之前AC不了的原因!
                flag=1;
            a=a<<1;
            a=a|flag;
            ++cnt;
        }
        return false;
    }
     
    int main()
    {
        int n;
        while(cin>>n){
            unsigned short a,b;
            for(int i=0;i<n;++i){
                cin>>a>>b;
                bool ans=check(a,b)||check(b,a);
                if(ans)
                    cout<<"YES"<<endl;
                else
                    cout<<"NO"<<endl;
            }
        }
        return 0;
    }
     
    /**************************************************************
        Problem: 1151
        User: lcyvino
        Language: C++
        Result: Accepted
        Time:0 ms
        Memory:1520 kb
    ****************************************************************/
  • 相关阅读:
    multiselect2side双向选择列表插件改进版
    通用权限管理平台--实现站点地图
    通用权限管理平台--系统日志
    通用权限案例平台--登录认证
    通用权限管理平台--代码结构
    通用权限管理平台--功能划分
    通用权限管理平台--架构选型
    tests
    Python 2.7_多进程获取简书专题数据(一)
    python2.7 爬取简书30日热门专题文章之简单分析_20170207
  • 原文地址:https://www.cnblogs.com/Murcielago/p/4138280.html
Copyright © 2020-2023  润新知