每日一题 (不用加减乘除做加法,找到数组中消失的数字)

不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com)

可以使用位运算符实现两个整数的加法:

在二进制加法中,我们通常使用“逐位相加”的方法来模拟常规加法的过程。当两个数字进行加法运算时,从最低位(通常是右侧)开始相加,然后考虑进位。如果相加的结果产生进位,那么这个进位会被带到下一位的加法中。

while (b != 0) 循环是为了确保所有的位都被正确地相加,并处理了所有可能的进位。这里 b 实际上充当了一个“进位标志”的角色。只要 b 不为0,说明还有进位需要处理,所以循环会继续执行。

具体来说:

  1. 当 b 为0时,意味着没有进位,加法运算已经完成。
  2. 当 b 不为0时,表示还有进位需要加到下一位上。这时,通过 a = a ^ b; 计算当前位(不考虑进位的和),然后通过 b = carry << 1; 将进位左移一位(即考虑到下一位的加法中)。

这种算法通常被称为“无进位加法”或“二进制加法”,它模仿了人类手动进行二进制数加法的过程。通过不断迭代,直到没有进位为止(即 b 为0),最终得到两个二进制数的和。

简而言之,while (b != 0) 循环确保了所有位都被正确相加,并且处理了所有可能的进位,直到得到一个最终的和,其中没有进一步的进位需要处理。

在二进制加法中,b = carry << 1; 这一步是将进位(carry)左移一位。这模拟了在传统的十进制加法中,当两个数字相加的和超过9时,我们会进一位到更高的数位。在二进制中,这个概念类似,只是数字变成了2而不是10。

让我们分解这一步:

  1. 进位(carry: 在二进制加法中,carry 变量存储了上一轮加法运算产生的进位。这个进位是那些在两个相加数字的对应位上都是1的位产生的。在二进制中,1 + 1 = 10,所以产生了一个进位(1)和一个输出位(0)。

  2. 左移一位(<< 1: 在计算机中,左移操作等同于乘以2。因此,将进位值左移一位实际上是将它乘以2。在二进制加法中,这表示将进位传递到更高的位。例如,如果在最低位(第0位)有一个进位,左移一位后,这个进位就会出现在下一位(第1位)。

  3. 更新 bb 变量在算法中扮演着双重角色。在最开始的迭代中,它是第二个加数。但在后续的迭代中,它存储了从上一次迭代传递下来的进位。因此,b = carry << 1; 更新了 b 的值,以便在下一次循环迭代中处理这个进位。

这个过程重复进行,直到没有进位(b == 0)为止。每次迭代都处理一对位,并可能产生一个新的进位,这个进位在下一次迭代中被处理。最终,当没有更多的进位需要处理时,算法完成,a 变量中存储的就是两个原始数字的和。

总结来说,b = carry << 1; 这一步是二进制加法中的关键部分,它负责将进位传递到更高的位,并准备在下一次循环迭代中处理这个进位。

#include <stdio.h>  int addWithoutArithmetic(int a, int b) {  while (b != 0) {  int carry = a & b;  //这步操作找出两个数在相同位置都为1的位,这些位将在加法中产生进位a = a ^ b;  //得到没有考虑进位的加法结果。这步操作找出两个数在不同位置为1的位,这些位将在加法中产生1b = carry << 1;  }  return a;  
}  int main() {  int num1 = 5;  int num2 = 3;  int sum = addWithoutArithmetic(num1, num2);  printf("The sum of %d and %d is %d\n", num1, num2, sum);  return 0;  
}

448. 找到所有数组中消失的数字 - 力扣(LeetCode)

代码使用了一种巧妙的方法,即利用数组元素的正负性标记其是否出现过,从而找出缺失的数字 。

#include <stdio.h>  
#include <stdlib.h>  int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
//接受一个整数数组nums、数组的大小numsSize,以及一个用于返回结果数组大小的指针returnSize{  // 遍历数组,将元素对应的索引位置上的元素取负值  for (int i = 0; i < numsSize; i++) {  //遍历数组nums,将元素对应的索引位置上的元素取负值。因为数组中的元素范围是1到n,所以我们用abs(nums[i]) - 1来得到对应的索引(减1是因为数组索引从0开始)。如果索引i上的元素是正数,就将其取负值,表示这个数字出现过int index = abs(nums[i]) - 1; // 将元素值转换为索引,因为元素值在1到n之间  if (nums[index] > 0) { // 确保不会对一个负数取反  nums[index] = -nums[index];  }  }  // 找出那些仍然为正数的索引,这些索引对应的数字就是缺失的数字  int* result = (int*)malloc(numsSize * sizeof(int));  int count = 0;  for (int i = 0; i < numsSize; i++) {  //再次遍历数组nums,找出那些仍然为正数的索引。这些索引对应的数字就是缺失的数字。对于每个正数索引i,将i + 1(因为缺失的数字范围也是1到n)添加到结果数组result中,并增加计数器countif (nums[i] > 0) {  result[count++] = i + 1; // 将索引转换为缺失的数字,并计数  }  }  // 设置返回数组的大小  *returnSize = count;  return result;  
}  int main() {  int nums[] = {4, 3, 2, 7, 8, 2, 3, 1};  int numsSize = sizeof(nums) / sizeof(nums[0]);  int returnSize;  int* result = findDisappearedNumbers(nums, numsSize, &returnSize);  printf("The missing numbers are: ");  for (int i = 0; i < returnSize; i++) {  printf("%d ", result[i]);  }  printf("\n");  // 释放结果数组的空间  free(result);  return 0;  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/467041.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Roop的安装教程

roop插件的安装&#xff0c;并不容易 并且最好就是在电脑本地完成&#xff0c;因为涉及到C、visual studio软件&#xff0c;并且还需要在电脑本地放置一些模型&#xff0c;用autoDL其实也有镜像&#xff0c;但是需要数据扩容至少100G&#xff0c;烧钱。。。 电脑本地&#xff0…

000——对i.MAX6uLL进行开箱检查

目录 00外观检查 01有线网卡检查 02USB-host测试 03耳机测试 04按键测试 05查看CPU温度 00外观检查 看起来没什么问题&#xff0c;买了半年了刚开始要做 01有线网卡检查 开机启动正常&#xff0c;韦东山老师还写了个欢迎界面&#xff0c;这个我后面因为要用于毕业设计&am…

一、Docker/安装包部署ClickHouse

Docker/安装包部署ClickHouse 一、docker部署1.安装Docker2.拉取ClickHouse镜像2.1 选择拉取版本2.2 拉取镜像 3.启动ClickHouse3.1 确定好挂载目录3.2 测试环境3.3 生产环境3.1.1 获取配置文件3.1.2 配置文件中添加用户3.1.3 启动容器 4.使用DBeaver连接 二、安装包安装1.准备…

Python基于大数据的电影预测分析系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Linux:搭建docker私有仓库(registry)

当我们内部需要存储镜像时候&#xff0c;官方提供了registry搭建好直接用&#xff0c;废话少说直接操作 1.下载安装docker 在 Linux 上安装 Docker Desktop |Docker 文档https://docs.docker.com/desktop/install/linux-install/安装 Docker 引擎 |Docker 文档https://docs.do…

PKI - 借助Nginx实现_客户端使用CA根证书签发客户端证书

文章目录 Pre概述步骤1. 创建根证书2. 生成客户端证书3. 准备客户端证书扩展文件4. 签发客户端证书5. 配置Nginx5. 重启 Nginx6. 测试 SAN 证书扩展案例&#xff1a;使用IP访问 Pre PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证 PKI - 数字签名与数字证书…

一个下载底图的网站(支持Google、必应、esri、天地图、星图地球、maptile等)

简介 hello&#xff0c;我是锐多宝&#xff0c;今天介绍一个免费的、无需登录、可自定义的底图数据下载网站。 网址为&#xff1a;https://layerdownload.ruiduobao.com/。相关信息可以看下面的视频&#xff1a; 多种遥感底图下载方法&#xff08;Google遥感底图、必应遥感底…

05-编码篇-H264文件分析

通过前面的分析&#xff0c;我们可以看出常规情况下&#xff0c;是将视频以帧的单位进行处理&#xff0c;比如I帧&#xff0c;P帧&#xff0c;B帧等。 但是这些帧是如何以文件方式保存的呢&#xff0c;这节我们主要对H264的保存方式作一个了解。 一帧图片通过编码后&#xff0c…

回显服务器(基于TCP)

目录 API学习 ServerSocket Socket 服务端 思路分析 具体实现 客户端 思路分析 具体实现 运行测试 问题分析 修改优化 完整代码 在学习了基于UDP实现的回显服务器后&#xff0c;我们学习基于TCP实现的回显服务器 API学习 ServerSocket ServerSocket是创建TCP服…

07:指针

指针 1、什么是指针1.1、地址的定义1.2、指针的作用 2、指针的分类2.1、基本类型指针2.2、指针和数组2.2.1、指针和一维数组2.2.1.1、一维数组名2.2.1.2、下标和指针的关系2.2.1.3、确定一维数组需要几个参数2.2.1.4、指针变量的运算2.2.1.5、指针变量占用几个字节 2.2.2、动态…