zoukankan      html  css  js  c++  java
  • 题目1513:二进制中1的个数

    题目描述:

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

    输入:

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

    输出:

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

    样例输入:
    3
    4
    5
    -1
    样例输出:
    1
    2
    32
    分析:(常规算法)把1和n做与运算,检验n最右一位是不是1,然后把1左移一位检验n右边第二位是不是1,依次进行,就可以得出n的2进制中有多少个1.
       (惊喜算法)把n-1与n做与运算,会把n最右边一个1变成0,那么n的二进制表示中有多少个1,就可以进行多少次这样的操作.
    #include <stdio.h>
    
    unsigned int flag=1;
    
    void NumOfOneNormal(int n)
    {
        flag=1;
        int cnt=0;
        while(flag)
        {
            if(n&flag)
                cnt++;
            flag=flag<<1;
        }
        printf("%d
    ",cnt);
    }
    
    void NumOfOne(int n)
    {
        int cnt=0;
        while(n)
        {
            cnt++;
            n=(n-1)&n;
        }
        printf("%d
    ",cnt);
    }
    
    int main()
    {
        int n,t;
        while(~scanf("%d",&t))
            while(t--)
            {
                scanf("%d",&n);
                NumOfOne(n);
            }
        return 0;
    }
    
    
  • 相关阅读:
    NDK中使用pthread多线程中自己写的一个BUG
    Android Native crash日志分析
    Android细笔记--DataStorage
    求二叉树第n层节点数
    对YUV数据进行裁剪
    Android XML中引用自定义内部类view的四个why
    Android细笔记--ContentProvider
    Android Log Tag含义
    189-RotaeArray
    二分查找法
  • 原文地址:https://www.cnblogs.com/aboutblank/p/3222542.html
Copyright © 2011-2022 走看看