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;
}

浙公网安备 33010602011771号