更多精彩内容,请关注 【力扣中等题】 。
难度:★★☆☆☆
类型:数学
给定两个整数,被除数 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)