29. 两数相除(Python)

29. 两数相除(Python),第1张

更多精彩内容,请关注 【力扣中等题】 。

难度:★★☆☆☆

类型:数学

给定两个整数,除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

说明

被除数和除数均为 32 位有符号整数。

除数不为 0。

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。

示例 1

输入: dividend = 10, divisor = 3

输出: 3

示例 2

输入: dividend = 7, divisor = -3

输出: -2

由于商不会大于被除数,因此可以把题目当做一个查找问题,就可以使用二分法解决。在程序开始,首先要对结果到的正负号进行判断,并将被除数和输出取绝对值。类似题目 【题目69. x的平方根】

如有疑问或建议,欢迎评论区留言~

C语言中,两整数相除,带两位小数的结果,可以使用下面的方法:

参考代码如下:

#include<stdio.h>

int main(){

int a,b

printf("Please input a=")

scanf("%d",&a)

printf("Please input b=")

scanf("%d",&b)

printf("a/b=%.2f",(float)a/b)

}

执行结果如下:

两数相除比较麻烦。先解释一下过程(16位CPU, 无符号整数为例       32位数/16位除数)。

DIV命令:

32位的被除数在DX:AX中,DX为高位字 16位除数为源 *** 作数,结果的16位商在AX中,16位余数在DX中。

(AX)<-(DX, AX)/(SRC)的商

(DX)<-(DX, AX)/(SRC)的余数

这里产生一个问题:16位数最大表示数值为:65535,而如果一个超过16位的被除数,除以1,数学结果应该是商放在AX中,但很显然,余数超出了AX的表达范围,产生了溢出。

所以,解决这个问题,就需要我们设计数学算法。

1个数,可以以一个比例,分解为高位与低位,比如:

1623,我们以100为比例,可以分隔为高位(16),与低位(23),那么做除法方式呢?假设除以10

16/10  = 1 余6

(6*100 + 23)/10 = 62  余3

1* 100 + 62 = 162 (商)

所结果就是1623/10 = 162  余 3   ,这明显计算正确。总结一下:

假定被除数X的高位部分H,低位部分L,除数N,而比例我们则取16位寄存器的进位值  2^16=65536,我们用D表示。

所以,算法表示为:X/N = int(H/N) * D  + [rem(H/N)*D + L]/N

int表示数的整数部分,rem表示数的余数部分。

根据这个算法,我们就可以编写一个不产生溢出的汇编除法程序了。

可以参照 我的附件caldiv.asm中的实际。

-----------------------------------------------------------------

写完上面部分,才发现我好像偏题了。你是想要一个汇编写的除法程序做例子吧,而不是想知道如何做汇编不产生溢出的除法。

简单点写:

code segment

assume cs:code

start:

    mov ax,  0ABCDH

    mov bx, 15

    xor dx, dx             做0ABCDH/15的除法 *** 作, 16位

    div bx                  商在ax中,余数在dx中

     处理 ax的代码

    处理 dx的代码,这里全留空了。

    除法2,  8位

    mov al, 88

    mov ah,0

    mov cl, 3

    div cl         (ax)/(cl)     ,商在al中,余数在ah中,然后再对计算结果进行处理。

 

    mov ah,4ch

    int 21h

code ends

end start


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12208195.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存