AcWing 801. 二进制中1的个数——算法基础课题解

server/2024/10/21 6:19:46/

AcWing 801. 二进制中 1 的个数

题目描述

给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。

输入格式

第一行包含整数 n。

第二行包含 n 个整数,表示整个数列。

输出格式

共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。

数据范围

1≤n≤100000,

0≤数列中元素的值≤10^9

输入样例

5
1 2 3 4 5

输出样例

1 1 2 1 2

C++

#include <iostream>using namespace std;int main() {int n;scanf("%d", &n);while (n--) {int x, s = 0;scanf("%d", &x);for (int i = x; i; i -= i & -i) s++;printf("%d ", s);}return 0;
}

i -= i & -i 这行代码是在计算 i 的二进制表示中最低位的 1,然后从 i 中减去这个值。

首先,-ii 的二进制补码,它的计算方式是先对 i 的二进制表示取反,然后加 1。这样,i & -i 的结果就是 i 的二进制表示中最低位的 1

然后,i -= i & -i 就是将 i 减去它的二进制表示中最低位的 1。这样,i 的二进制表示中的最低位的 1 就被去掉了。

例如,假设 i 的值是 12,它的二进制表示是 1100-i 的二进制表示是 0100,所以 i & -i 的结果是 0100。然后,i -= i & -i 的结果就是 1000,也就是 8。这样,i 的二进制表示中的最低位的 1 就被去掉了。

这个操作在计算一个数的二进制表示中 1 的个数时非常有用,因为每次循环都会去掉 i 的二进制表示中的一个 1,直到 i 变为 0 为止。

在 C++中,-i 是通过取 i 的二进制补码来计算的。具体步骤如下:

  1. 首先,对 i 的二进制表示取反。这意味着所有的 1 变为 0,所有的 0 变为 1
  2. 然后,将取反后的结果加 1

例如,假设 i 的值是 5,它的二进制表示是 0101。取反后,我们得到 1010。然后,我们将这个结果加 1,得到 1011。所以,-i 的二进制表示是 1011,对应的十进制值是 -5

这种计算方式是基于二进制补码的原理,它是计算机内部表示和处理负数的一种方式。

Go

package mainimport ("bufio""os""strconv""strings"
)func main() {reader := bufio.NewReader(os.Stdin)line, _ := reader.ReadString('\n')params := strings.Fields(line)n, _ := strconv.Atoi(params[0])line, _ = reader.ReadString('\n')params = strings.Fields(line)writer := bufio.NewWriter(os.Stdout)defer writer.Flush()for i := 0; i < n; i++ {var count intnum, _ := strconv.Atoi(params[i])for num > 0 {num -= num & -numcount++}writer.WriteString(strconv.Itoa(count) + " ")}
}
package mainimport "fmt"func main() {var n intfmt.Scanf("%d\n", &n)for i := 0; i < n; i++ {var tmp int64var count intfmt.Scanf("%d", &tmp)for tmp > 0 {tmp -= tmp & -tmpcount++}fmt.Printf("%d ", count)}
}

模板

求n的第k位数字: n >> k & 1
返回n的最后一位1lowbit(n) = n & -n

n >> k 这个操作是将 n 右移 k 位。在二进制表示中,右移一位等同于将这个数除以 2。所以,n >> k 就是将 n 除以 2k 次方。这个操作的结果是将 n 的第 k 位移动到最低位。

然后,& 1 这个操作是将上述结果与 1 进行按位与操作。在二进制表示中,任何数与 1 进行按位与操作,结果都等于这个数的最低位。所以,n >> k & 1 的结果就是 n 的第 k 位。

例如,假设 n 的值是 13,它的二进制表示是 1101。如果我们想获取第 2 位,我们可以计算 n >> 2 & 1

  1. n >> 2 的结果是 11(即 3),这是将 n 的第 2 位移动到最低位的结果。
  2. 3 & 1 的结果是 1,这就是 n 的第 2 位。

http://www.ppmy.cn/server/19927.html

相关文章

玩转B2B2C,智能名片小程序带你开启“撩”客新纪元!

在这个数字化浪潮汹涌的时代&#xff0c;你还在为如何快速有效地抓住客户而焦头烂额吗&#xff1f;嘿嘿&#xff0c;别担心&#xff0c;现在有了我们的B2B2C AI智能名片小程序&#xff0c;一切都变得轻而易举&#xff01;这款小程序&#xff0c;就像是一个精通社交的“撩客达人…

第29篇 分布式网站

大型分布式网站架构是指将一个网站系统分解为多个独立的组件或服务&#xff0c;这些组件或服务部署在不同的物理或虚拟机器上&#xff0c;协同工作以提供高效、可靠且可扩展的网站功能。这种架构设计旨在应对高并发访问、处理海量数据、保证服务高可用性、快速响应业务变化及增…

网络安全实训Day15

写在前面 电子垃圾&#xff0c;堂堂恢复连载。本来不想分天数梳理了&#xff0c;但是最后要写实训报告&#xff0c;报告里还要有实训日记记录每日学的东西&#xff0c;干脆发这里留个档&#xff0c;到时候写报告提供一个思路。 网络空间安全实训-渗透测试 渗透测试概述 定义 一…

Hive——DML(Data Manipulation Language)数据操作语句用法详解

DML 1.Load Load语句可将文件导入到Hive表中。 hive> LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1val1, partcol2val2 ...)];关键字说明&#xff1a; local&#xff1a;表示从本地加载数据到Hive表&#xff1b;否则从HD…

MIT6.824|课程前置知识

为了让技术栈更宽一点&#xff0c;想学习一下分布式系统&#xff0c;顺便下定决心学习一下go语言吧&#xff01; 由于还没有开始学&#xff0c;这里只总结相关的资料&#xff0c;后续会慢慢进化成MIT6.824课程导学。 Go语言 MIT6.824课程是用go语言来完成的&#xff0c;所以了…

机器人系统能用MQTT5.0代替ROS2吗?

前言 ROS2是目前最主流的机器人系统&#xff0c;但由于ROS2的学习曲线比较徒陗&#xff0c;而且对于资源受限的系统并不友好&#xff1b;而MQTT5.0是最新的MQTT消息传输协议&#xff0c;为现代IoT提供了更友好的支持&#xff0c;下面讨论MQTT5.0和ROS2结合使用&#xff0c;或机…

前端提高篇(二十四)JS进阶18对象属性的高级用法

x:1, y:2, } Object.defineProperty(obj1, ‘z’,{ value:3, writable:true, enumerable:true, configurable:true, }) for (var i in obj1){ console.log(i ’ : ’ obj1[i]); } 运行效果&#xff1a; 不可枚举时&#xff1a; var obj1 { x:1, y:2, } Obj…

基于EasyExcel实现的动态表头工具类

工具类 package net.lesscoding.utils;import cn.hutool.core.bean.BeanUtil; import com.alibaba.excel.EasyExcel; import com.google.common.collect.Lists;import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.Uns…