文章

1

粉丝

0

获赞

18

访问

219

头像
0和1的个数 题解:
P1008 华南师范大学/贵州大学机试
发布于2026年3月4日 00:28
阅读数 219

大家都忽略了负数的情况,包括测试用例也忽略了这个问题。正确最优解如下:

#include <iostream>

using namespace std;

int main() {
    int num;
    // 推荐统一使用 cin/cout,或者统一使用 scanf/printf
    if (cin >> num) { 
        int count1 = 0;
        
        // int 固定为 32 位,直接循环 32 次检查每一位
        for (int i = 0; i < 32; i++) {
            // (num >> i) 将第 i 位移动到最右边
            // & 1 用于判断最右边这一位是不是 1
            if ((num >> i) & 1) {
                count1++;
            }
        }
        
        int count0 = 32 - count1;
        cout << "count0=" << count0 << " count1=" << count1 << endl;
    }
    return 0;
}

 

  • 通杀正负数和零:不管 num 是正是负还是零,它在内存中必定是 32 个比特位。移位操作 >> 配合按位与 & 会诚实地反映这 32 位里到底有几个 1。
  • 时间复杂度极低:仅仅是一个固定的 32 次极简循环,没有除法(除法在底层指令中相对较慢),也没有动态数组的内存分配。

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发