n位数字的乘法和除法

在计算机做n位二进制乘法时,每一位与n位相乘,乘以n次,时间复杂度是n^2
现在采取一种办法:每次把被乘数除以2,乘数乘以2,最后肯定被乘数变为1或者是0,但结果可能偏小,因为被乘数会因为是奇数不能被2整除而丢失一部分
x/2=(x-1)/2
x/2 * y * 2->(x-1)/2 * y * 2 result+=y
当x为偶数时不需要考虑这个问题

int res = 0; int a = 11, b = 13; while (a > 1) { if (a % 2 != 0)res += b; a /= 2; b *= 2; } res += b; printf("%d", res);
根据递推关系式可以写成一个递归调用
int mul(int a, int b) { if (a == 0)return 0; int c = mul(a / 2, b); if (a % 2 == 0)return c * 2; else return c * 2 + b; }

n位除法也可以考虑逐级改变2个数,但除数不能减小,否则最后变成了0,只有被除数不断减小
a除以b的商和余数分别是q和r,2a除以b的商和余数是2q和2r,或者是(2q+1)和(2r-q)
typedef struct divide { int q; int r; }divide;

divide div(int a, int b)
{
	divide res;
	if (a == 0) {
		res.q = 0, res.r = 0;
		return res;
	}
	res = div(a / 2, b);
	res.q *= 2; res.r *= 2;
	if (a % 2 != 0)res.r += 1;
	if (res.r >= b) { res.r -= b; res.q += 1; }
	return res;
}
posted @ 2021-09-12 10:53  empty_thought  阅读(532)  评论(0)    收藏  举报