深圳网站的优化公司哪家好,自己能自学网站建设吗,经济研究院网站建设方案,常州天狼网站建设不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com) 可以使用位运算符实现两个整数的加法#xff1a;
在二进制加法中#xff0c;我们通常使用“逐位相加”的方法来模拟常规加法的过程。当两个数字进行加法运算时#xff0c;从最低位#xff08;通常是右侧#xff09;开…不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com) 可以使用位运算符实现两个整数的加法
在二进制加法中我们通常使用“逐位相加”的方法来模拟常规加法的过程。当两个数字进行加法运算时从最低位通常是右侧开始相加然后考虑进位。如果相加的结果产生进位那么这个进位会被带到下一位的加法中。
while (b ! 0) 循环是为了确保所有的位都被正确地相加并处理了所有可能的进位。这里 b 实际上充当了一个“进位标志”的角色。只要 b 不为0说明还有进位需要处理所以循环会继续执行。
具体来说
当 b 为0时意味着没有进位加法运算已经完成。当 b 不为0时表示还有进位需要加到下一位上。这时通过 a a ^ b; 计算当前位不考虑进位的和然后通过 b carry 1; 将进位左移一位即考虑到下一位的加法中。
这种算法通常被称为“无进位加法”或“二进制加法”它模仿了人类手动进行二进制数加法的过程。通过不断迭代直到没有进位为止即 b 为0最终得到两个二进制数的和。
简而言之while (b ! 0) 循环确保了所有位都被正确相加并且处理了所有可能的进位直到得到一个最终的和其中没有进一步的进位需要处理。
在二进制加法中b carry 1; 这一步是将进位carry左移一位。这模拟了在传统的十进制加法中当两个数字相加的和超过9时我们会进一位到更高的数位。在二进制中这个概念类似只是数字变成了2而不是10。
让我们分解这一步 进位carry: 在二进制加法中carry 变量存储了上一轮加法运算产生的进位。这个进位是那些在两个相加数字的对应位上都是1的位产生的。在二进制中1 1 10所以产生了一个进位1和一个输出位0。 左移一位 1: 在计算机中左移操作等同于乘以2。因此将进位值左移一位实际上是将它乘以2。在二进制加法中这表示将进位传递到更高的位。例如如果在最低位第0位有一个进位左移一位后这个进位就会出现在下一位第1位。 更新 b: b 变量在算法中扮演着双重角色。在最开始的迭代中它是第二个加数。但在后续的迭代中它存储了从上一次迭代传递下来的进位。因此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;
}