0

0

不使用乘法、除法和取模运算符来进行两个整数的除法

WBOY

WBOY

发布时间:2023-09-21 12:41:02

|

1851人浏览过

|

来源于tutorialspoint

转载

不使用乘法、除法和取模运算符来进行两个整数的除法

在这个问题中,我们只需要将两个整数相除,而不需要使用乘法、除法和取模运算符。尽管我们可以使用加法、乘法或位操作。

问题陈述指出我们将得到两个整数 x 和 y。在不使用乘法、除法或取模运算符的情况下,我们需要确定 x 除以 y 后的商。

示例

输入:x=15,y=5

输出:3

输入:x=10,y=4

输出:2

输入:x=-20,y=3

输出:-6

方法

方法1(使用简单的数学)

在这种方法中,我们将使用一个简单的数学算法。下面是我们要遵循的步骤的分步说明 -

  • 我们将从被除数(即 x)中不断减去除数(即 y),直到 x 大于或等于 y。

  • 当 y 大于 x 时,即除数大于被除数,被除数变为余数,减法次数变为商。

  • 将减法执行的次数存储在变量中并返回它,这是我们想要的输出。

示例

下面是上述算法的 C++ 实现 &minnus;

#include 
#include 
using namespace std;
long long division(long long a,long long b) // where a is dividend and b is divisor
{
   long long sign=1;
   if((a<0) ^( b<0))  // - ^ - = +,+ ^ - = - , - ^ + = - , + ^ + = +
   {
      sign=-1; 
   }
   long long m=abs(a);
   long long n=abs(b);
   long long count=0; // for storing the quotient 
   while(m>=n){
      m=m-n;
      count++;
   }
   if(sign==-1) // when sign is negative
   {
      count=-count;
   }
   return count;
} 
int main(){
   long long a=-21474;
   long long b=2;
   long long val=division(a,b);
   cout<

输出

-10737

时间复杂度:O(a/b)

空间复杂度:O(1)

方法 2(使用位操作)

  • 由于任何数字都可以用 0 或 1 的形式表示,因此可以使用移位运算符以二进制形式表示商。

  • 使用 for 循环迭代除数从 31 到 1 的位位置。

  • 找到除数即 b

  • 验证下一个位置时,将结果添加到 temp 变量中,以确保 temp+(b

  • 每次通过计算商来更新商OR 1

  • 更新相应符号后返回商。

    知了追踪
    知了追踪

    AI智能信息助手,智能追踪你的兴趣资讯

    下载

示例

下面是上述方法的 C++ 实现 -

#include 
#include 
using namespace std;
long long division(long long a,long long b) // where a is dividend and b is divisor
{
   long long sign=1;
   if((a<0) ^( b<0))  // - ^ - = +,+ ^ - = - , - ^ + = - , + ^ + = +
   {
      sign=-1; 
   }
   long long m=abs(a);
   long long n=abs(b);
   long long count=0; // for storing the quotient 
   long long temp=0;
   for (int j = 31; j >= 0; --j){
   
      if (temp + (n << j) <= m){
         temp += n << j;
         count |= 1L << j;
      }
   }
   if(sign==-1) // when sign is negative
   {
      count=-count;
   }
   return count;
   
} 
int main(){
   long long a=49;
   long long b=5;
   long long val=division(a,b);
   cout<

输出

9
-3

时间复杂度:O(log(a))

空间复杂度:O(1),因为它不使用额外的空间。

方法 3(使用对数函数)

在这种方法中,我们将使用一个简单的对数函数来计算商。

众所周知,

$$\mathrm{In(\frac{a}{b})\:=\:In(a)\:-\:In(b)}$$

可以进一步修改为

$$\mathrm{\frac{a}{b}\:=\:e^{(In(a)\:-\:In(b))}}$$

因此,这是使用这种有效方法解决给定问题的基本思想。

下面是我们将要遵循的方法的分步说明 -

  • 如果其中一个(即被除数或除数)为 0,我们将返回 0。

  • 现在,我们将使用异或函数 (XOR) 检查符号,以将符号存储在变量中。

  • 如果除数为 1,则直接返回被除数。

  • 现在,声明一个变量并使用 exp 函数和 log 函数。

  • Log 和 exp 是 C++ 中的内置函数。 Log 函数返回输入数字的自然对数值,exp 返回等于 e 加上输入值的值。

示例

下面是上述方法的 C++ 实现 -

#include 
#include 
using namespace std;
long long int divide(long long int a,long long int b){
   long long int sign=1;
   if(a==0||b==0) // when a is zero or b is zero
   {
      return 0;
   }
   if((a>0) ^ (b>0)) // - ^ - = +,+ ^ - = - , - ^ + = - , + ^ + = +
   {
      sign=-1;
   }
   if(b==1) // when b is 1 then it will return a example 51/1 = 51
   {
      sign==-1?-a:a;
      return a;
   }
   long long int m=abs(a);
   long long int n=abs(b);
   
   //log function return the logarithmic value of the entered value with base e i.e. natural log of the entered value
   //exp function return the value equal to e^(entered value)
   long long int ans =exp(log(m) - log(n)) + 0.0000000001; 
   
   // if it gives the value in decimal we will add from 0.0000000001 to account for accuracy errors
   if(sign==-1) // when sign is negative return the negative ans
   {
      return -ans;
   }
   return ans;
   
}
int main(){
   long long int ans=divide(47,-9);
   cout<

输出

-5

时间复杂度:O(1),,因为执行该操作需要恒定的时间。

空间复杂度:O(1),因为它不使用额外的空间。

结论

在本文中,我们学习在不使用乘法、除法或取模运算符的情况下将两个整数相除。我们学会了用不同的方法以不同的效率解决问题。他们使用简单的数学、位操作和对数函数。其中,使用对数函数是最有效的方法,因为它的时间复杂度为 O(1),是所有方法中最小的。

我希望这篇文章可以帮助您解决有关该主题的所有概念。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

402

2023.08.14

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

20

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

5

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

26

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

2

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

7

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.2万人学习

C++教程
C++教程

共115课时 | 12.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号