使用递归思想解决乘法、除法、指数运算、求最大公约数等的C语言代码实现:
乘法:
公式:x*y = 2*x*(y/2 向下取整) (y为偶数) 或者 2*x*(y/2 向下取整)+x (y为奇数)
ulong multiply(ulong x,ulong y) { if (y == 0) return 0; ulong z, half = y >> 1; z = multiply(x,half); if (y%2) return x+(z << 1); else return z << 1; }
void divide(ulong x,ulong y, struct divide_result *result) { if (x == 0) { result->q = 0; result->r = 0; return; } ulong half = x >> 1; struct divide_result z; divide(half, y, &z); result->q = z.q << 1; result->r = z.r << 1; if (x%2) { result->r ++; } if (result->r >= y) { result->r -= y; result->q ++; } return; }
ulong modexp(ulong x, ulong y, ulong N) { if (y == 0) return 1; ulong z; ulong half = y >> 1; z = modexp(x,half,N); if (y%2) return multiply(multiply(z,z),x)%N; else return multiply(z,z)%N; }
求最大公约数,这里利用了一个欧几里德发明的公式:
gcd(a,b) = gcd(a mod b, b)
ulong euclid(ulong x,ulong y) { if (y == 0) return x; return euclid(y, x%y); }太简单了吧,哈哈
还有一个扩展公式:
void extended_euclid(ulong x, ulong y, struct extend_euclid *result) { if (y == 0) { result->a = 1; result->b = 0; result->d = x; return; } struct extend_euclid z; extended_euclid(y, x%y, &z); struct divide_result r; divide(x, y, &r); result->a = z.b; result->b = z.a - multiply(r.r, z.b); result->d = z.d; }