C++ 不使用算术运算符减去1
这个问题要求我们在不使用算术运算符的情况下减去1。我们将被给予问题输入中的任何整数N,并且我们需要从该数字中减去1,或者只需打印N-1。我们的任务是在不使用任何算术运算符的情况下执行这个操作。
算术运算涉及对数字进行各种操作,如加法(+),减法(-),乘法(*),除法(/),取模(%)等。这些操作在每种编程语言中都支持对数字的操作。尽管如此,我们需要从该数字减去1。
例如,
输入
7
输出
6
说明:输入的数字N是7。从N中减去1得到6,这是期望的结果。请记住,我们不允许对N进行任何数学运算。
输入
24
输出
23
解释:从数字N中减去1。
让我们看看可以用来解决这个问题的算法,而不使用任何算术运算符。
算法
可以使用位操作技术解决该问题,这些技术使得C++的位运算符可用。与运算符(and)、或运算符(|)、异或运算符(^)、非运算符(~)、左位移运算符(<<)和右位移运算符(>>)是C中的可执行位操作之一。为了处理C++中的位,我们使用某些基本位操作。
为了解决问题,该方法仅使用异或运算符和左移运算符。
由于任何数字都可以用二进制形式表示。数字10的二进制表示为1010。
如果观察形式为2^n的每个数字,其中n可以是任何正整数,可以表示为:
2^n = 2^{n-1} + 2^{n-2} + … + 2^0 + 1
如果数字为N,则从0到n-1的所有2的幂的和将给出等于(数字-1)的数字。
我们已经知道,以32位整数形式从2^0到2^{31}的任何数字在二进制形式下都遵循相同的模式。
因此,如果我们想从任何数字中减去1,只需找到第一个1位,并将其后的所有0位转换为1,并将该1位转换为0,保持剩余位相同,将给出等于N-1的数字。
让我们检查一下在我们的方法中实现这个算法。
方法
- 我们将创建一个变量“a”来找到数字的第一个1位。
-
为了找到数字的第一个1位,保持在while循环中迭代,直到(N&a)=0。当两个位都为1时,(N&a)将返回1。
-
在循环中迭代时,使用异或运算符更新数字N的位,直到找到数字的第一个1位。
-
在更新数字N的位的同时,每次左移a以检查第一个1位。
-
一旦找到第一个1位,循环将中断。我们已经将第一个1位后面的所有位更新为1。
-
现在使用异或运算符,将数字的第一个1位更新为0,因为当输入相同时,异或将返回0。
-
然后返回数字N,现在它将等于N-1。
下面是实现此方法的C++代码:
示例
#include <bits/stdc++.h>
using namespace std;
//function to subtract 1 using bitwise operators
int subtract(int N){
int a=1; //to find the first 1 bit of the number N
while((N&a)==0){ //iterate in the loop until we find the first 1 bit as 0&1=0 and 1&1=1
N=N^a; //keep updating the bits with 1 which are after first 1 bit of the number N
a=a<<1; //left shift a by 1
}
N=N^a; //update the first 1 bit of the number with 0 as 1^1=0
return N; //return the number which is equal to N-1
}
int main()
{
int N=175;
cout<<subtract(N)<<endl;
N=56;
cout<<subtract(N)<<endl;
return 0;
}
输出
174
55
时间复杂度 :O(log x),其中 x 是给定数字 N 的位数。
空间复杂度 :O(1),因为我们没有使用额外的空间。
结论
在本文中,通过利用位操作的方法,解决了从给定数字 N 中减去1而不使用任何算术运算符(即+,-,/,%,*)的问题。为了从提供的整数中减去1,使用了位运算符。
我希望这篇文章能帮助您理解问题的每个方面。