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

不用加减乘除做加法_牛客题霸_牛客网 (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.mzph.cn/news/689796.shtml

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

相关文章

软考学习--计算机组成原理与体系结构

计算机组成原理与体系结构 数据的表示 进制转换 R 进制转换为 10 进制–按权展开法 10进制转换为2进制 原码 反码 补码 移码 原码 &#xff1a;数字的二进制表示反码 &#xff1a; 正数的反码等于原码&#xff0c;负数的反码等于原码取反补码&#xff1a; 正数的补码等…

【算法】C语言使用qsort对字符串字符进行排序(解决字符串长度不统一的问题)

核心思想是 当a的长度>b时&#xff0c;a一定比b大当a,b长度相等时&#xff0c;通过strcmp比较哪个字典序大&#xff0c;也就是实际的数哪个大当a的长度&#xff1c;b是&#xff0c;b一定比a大 这时候就不得不感慨C的string是多么好用的&#xff0c;哎 #include<stdio.h…

⭐北邮复试刷题LCR 034. 验证外星语词典__哈希思想 (力扣119经典题变种挑战)

LCR 034. 验证外星语词典 某种外星语也使用英文小写字母&#xff0c;但可能顺序 order 不同。字母表的顺序&#xff08;order&#xff09;是一些小写字母的排列。 给定一组用外星语书写的单词 words&#xff0c;以及其字母表的顺序 order&#xff0c;只有当给定的单词在这种外…

软考30-上午题-数据结构-小结

一、杂题汇总 真题1&#xff1a; 有向图——AOV 带权有向图——AOE 真题2&#xff1a; 二叉排序树&#xff1a;左子树< 根节点 < 右子树。 二叉排序树中序遍历&#xff0c;节点关键字有序&#xff08;递增&#xff09;&#xff1b; 关键字初始序列有序&#xff0c;二叉树…

ubuntu 之 zeitgeist-fts 占用内存

座右铭&#xff1a;怎么简单怎么来&#xff0c;以实现功能为主。 欢迎大家关注公众号与我交流 sudo chmod -x /usr/bin/zeitgeist-daemonsudo chmod -x /usr/bin/zeitgeist-datahublocate zeitgeist-ftssudo chmod -x /usr/lib/x86_64-linux-gnu/zeitgeist-fts # 使用 locate z…

数据可视化利器:五款必备工具推荐

在数据可视化的世界里&#xff0c;工具的选择往往决定了工作的效率和效果。作为一名资深的数据可视化用户&#xff0c;我尝试并使用了众多的数据可视化工具。今天&#xff0c;我想向大家推荐五款我认为最好用、最实用的数据可视化工具。 1. 山海鲸可视化 山海鲸可视化以其强大…

计数排序和归并排序

计数排序 计数排序是一种非比较排序。 原理&#xff1a; 代码&#xff1a; void CountSort(int* nums, int numsSize) {int max nums[0], min nums[0];for (int i 0; i < numsSize; i) {if (nums[i] > max) {max nums[i];}if (nums[i] < min) {min nums[i];}}…

黑马程序员-瑞吉外卖day9

菜品分类下拉列表 CategoryController里面写 /*** 根据条件查询分类数据** param category* return*/GetMapping("/list")ApiOperation("菜品分类目录")public R<List<Category>> list(Category category) {List<Category> list cate…

后端扫盲系列 - vue入门指南

vue特点 组件化&#xff1a;用户界面分解为可重用的组件&#xff0c;这些组件可以使开发的页面更加模块化和可维护双向数据绑定&#xff1a;vue提供了一种轻松绑定数据和DOM元素之间的机制&#xff0c;意味着数据发送变化时&#xff0c;视图会自动更新&#xff0c;反之亦然虚拟…

GptSoVits音频教程

这个号称5秒克隆&#xff0c;或者用1分钟音频训练10分钟就能达到原声效果。 5秒的号称&#xff0c;只要是&#xff0c;什么几秒的&#xff0c;大家可以完全不要想了&#xff0c;什么知更鸟&#xff0c;什么火山&#xff0c;包括本次的GptSoVits的效果肯定是不行的&#xff0c;…

数据结构通讲

目录 集合源码详解 一、常见数据结构讲解 1. 线性数据结构 1.1 数组 1.2 队列 1.3 链表 1.3.1 单向链表 1.3.2 双向链表 1.4 栈 2. 非线性数据结构 2.1 树 2.2 二叉树 2.2.1 概念介绍 2.2.2 遍历操作 2.2.3 删除节点 2.2.4 查找局限性 2.2.5 AVL&#xff08; …

【C深剖】typedef关键字

简介&#xff1a;本系列博客为C深度解剖系列内容&#xff0c;以某个点为中心进行相关详细拓展 适宜人群&#xff1a;已大体了解C语法同学 作者留言&#xff1a;本博客相关内容如需转载请注明出处&#xff0c;本人学疏才浅&#xff0c;难免存在些许错误&#xff0c;望留言指正 作…

智能高压森林应急消防泵特点及优势

随着科技的发展&#xff0c;消防设备也在不断地升级改进。智能高压森林应急消防泵作为一种新型的消防设备&#xff0c;其特点和优势日益凸显&#xff0c;为森林火灾的扑救提供了有力的支持。本文将从以下几个方面对智能高压森林应急消防泵的特点和优势进行阐述。 一、高强度耐腐…

Ubuntu本地安装code-server结合内网穿透实现安卓平板远程写代码

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以&#xff0c;这里以VMwhere ubuntu系统为例 下载code server服务,浏览器…

机器学习第二十八周周报 PINNs2

文章目录 week28 PINNs2摘要Abstract一、Lipschitz条件二、文献阅读1. 题目数据驱动的偏微分方程2. 连续时间模型3. 离散时间模型4.结论 三、CLSTM1. 任务要求2. 实验结果3. 实验代码3.1模型构建3.2训练过程代码 小结参考文献 week28 PINNs2 摘要 本文主要讨论PINN。本文简要…

天然肠衣市场分析:预计到2025年将达到45亿美元

肠衣作为包装香肠馅料的原材料一般分为可食用和不可食用两种&#xff0c;其中天然肠是由猪、羊等家畜多层肠道制作而成的&#xff0c;近些年来天然肠衣在全球市场需求不断增加。一、全球市场分析 1. 市场规模&#xff1a;根据市场研究机构的数据&#xff0c;2019年全球天然肠衣…

访问学者感谢信|人文社科工作者赴北欧访学

编者按&#xff1a;这位访问学者从委托我们申请到获得邀请函只用了一个月时间。为了表达感激之情&#xff0c;其当时就写了这封感谢信&#xff0c;但依据我们的惯例&#xff0c;一般是待申请者出国&#xff0c;一切安排妥当后再发成功案例。所以时至今日&#xff0c;才将该申请…

比特浏览器bit_selenium3bit_selenium4使用

bit_selenium3 from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from bit_api import *# /browser/open 接口会返回 selen…

旧衣回收小程序开发,市场发展潜力巨大

在当下快节奏生活下&#xff0c;人们的闲置衣物越来越多&#xff0c;为了减少浪费&#xff0c;旧衣回收成成为了大众的选择。旧衣回收能够降低人们的损失&#xff0c;减少我国资源浪费&#xff0c;又能循环利用&#xff0c;是我国一个环保商业模式。 “互联网旧衣回收”推动市场…

消息队列(Message Queue)

目录 一、概念 二、消息队列使用场景 三、消息队列的两种模式 1.点对点模式 2.发布/订阅模式 四、常用消息队列介绍 1.RabbitMQ 1) 主要特性 2&#xff09;安装需要 3&#xff09;优点 4&#xff09;缺点 2.ActiveMQ 1&#xff09;主要特性 2) 安装需要 3&#xff09;优…