C++ 不使用算术运算符减去1

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^02^{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,使用了位运算符。

我希望这篇文章能帮助您理解问题的每个方面。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程