两个数相乘

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 04:03   63   0
/*
问题描述:计算两个无符号整数相乘的结果,不能使用加法,乘法,++等操作符
来源:网易算法课
作者:syt
日期:2017-9-17
思路:两个数相乘,不能使用乘法,一般转化到二进制的形态下进行操作,
两个二进制数相乘,可以转化为两个二进制数移位相加,由于不能使用加法,只要解决
不使用加法实现两个二进制数相加即可。

*/


#include <iostream>
#include <stack>

using namespace std;

//计算r中1所在的位数
int shift(int r)
{
 int p = 0;
 while (r > 0)
 {
  if ((r & 1) > 0)
  {
   return p;
  }
  r = r >> 1;
  p++;
 }
 return p;
}

//两个二进制数相加
int binaryAdd(int x, int y)
{
 int result = 0;
 int advance = 0;//进位
 int r = 1;//当前计算的位数

 while (x > 0 || y > 0)
 {
  int i = x & 1;
  int j = y & 1;

  x = x >> 1;
  y = y >> 1;

  int b = i^j;

  if (b > 0)
  {
   if (advance != 0)
   {
    b = 0;
   }
  }
  if (b == 0)
  {
   if ((i&j) > 0)
   {
    if (advance != 0)
    {
     b = 1;
    }
    else
    {
     advance = 1;
    }

   }
   else
   {
    if (advance != 0)
    {
     b = 1;
     advance = 0;
    }
   }
  }

  if (b > 0)
  {
   b = b << shift(r);
   result = result | b;
  }
  r = r << 1;
 }
 if (advance > 0)
 {
  result = result | (advance << shift(r));
 }
 return result;

}


//两个数相乘
int binaryMultiply(int a, int b)
{
 stack<int> mstack;
 int i = 0;

 //将a转化成二进制
 while (b > 0)
 {
  if ((b & 1) > 0)
  {
   mstack.push(a << i);
  }
  else
  {
   mstack.push(0);
  }

  b = b >> 1;
  i++;
 }

 while (mstack.size() > 1)
 {
  int x = mstack.top();
  mstack.pop();
  int y = mstack.top();
  mstack.pop();
  int z = binaryAdd(x, y);
  mstack.push(z);
 }

 int result = mstack.top();
 mstack.pop();

 return result;

}


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP