分治法求整數相乘
阿新 • • 發佈:2019-01-25
3824 *4369
=(38*10^2+24)*(43*10^2+69)
=(38*43)*10^2+(38*69+43*24)*10+24*69
這樣將相乘的數分成小的數相乘
#include<iostream> #include<algorithm> #include<stdio.h> using namespace std; #define SIGN(A) ((A > 0) ? 1 : -1) int pow(int x,int n) { int ans=1; for(int i=1;i<=n;i++) ans*=10; return ans; } int abs(int n) { if(n<0) return -n; else return n; } int IntegerMultiply(int X, int Y, int N) { int sign = SIGN(X) * SIGN(Y); int x = abs(X); int y = abs(Y); if((0 == x) || (0 == y)) return 0; if (1 == N) return sign*(x*y); else { int XL = x / (int)pow(10, (int)N/2); int XR = x - (XL * (int)pow(10, N/2)); int YL = y / (int)pow(10, (int)N/2); int YR = y - YL * (int)pow(10, N/2); int XLYL = IntegerMultiply(XL, YL, N/2); int XRYR = IntegerMultiply(XR, YR, N/2); int XLYRXRYL = IntegerMultiply((XL - XR), (YR - YL), N/2) + XLYL + XRYR; return sign * (XLYL * (int)pow(10, N) + (XLYRXRYL) * (int)pow(10, N/2) + XRYR); } } int main() { int x = 3824; int y = 4369; cout<<"x * y = "<<IntegerMultiply(x, y, 4)<<endl; cout<<"x * y = "<<x*y<<endl; return 0; }