// Created on iPad spades.
#include <iostream>
#include <string.h>
using namespace std;
int result[255];
// XY=AC*pow(2,n) + ((A-B) * (D-C) + AC + BD)*pow(2, n/2) + BD
void calculate(char X[], int len_X,char Y[], int len_Y, int s){
// 任意两操作数位数为0直接返回
if(len_X == 0 || len_Y == 0) return;
int len_B = len_X/2; // B属于X的低位部分
int len_A = len_X - len_B; // A是X的高位部分
int len_D = len_Y/2; // D属于Y的低位部分
int len_C = len_Y - len_D; // C属于Y的高位部分
char A[255], B[255], C[255], D[255];
// 分治递归到数组的位数全为一时直接相乘,加到对应数组的result的相应位置
if(len_X == 1 && len_Y == 1){
result[s] += (X[0] - '0')*(Y[0] - '0');
return;
}
for(int i = 0; i < len_A; i++)
A[i] = X[i];
for(int i = len_A, j = 0; i < len_X; i++)
B[j++] = X[i];
for(int i = 0; i < len_C; i++)
C[i] = Y[i];
for(int i = len_C, j = 0; i < len_Y; i++)
D[j++] = Y[i];
// 计算AC,并将其存在result[s+len_B+len_D]位置处
calculate(A, len_A, C, len_C, s+len_B+len_D);
// 计算BC,并将其存在result[s+len_D]位置处
calculate(B, len_B, C, len_C, s+len_D);
// 计算AD,并将其存在result[s+len_B]位置处
calculate(A, len_A, D, len_D, s+len_B);
// 计算BD,并将其存在result[s]位置处
calculate(B, len_B, D, len_D, s);
}
void f(int result[], int len){
for(int i = 0; i <= len; i++){
if(result[i] < 10);
int cnt = 1;
int tmp = result[i]/10;
result[i] %= 10;
while(tmp > 0){
result[i+cnt] += tmp%10;
tmp/=10;
cnt++;
}
}
}
int main() {
char X[100], Y[100];
cin>>X>>Y;
int len_X = strlen(X);
int len_Y = strlen(Y);
calculate(X, len_X, Y, len_Y, 0);
f(result, len_X + len_Y);
int i;
for(i = len_X+len_Y-1; i >= 0; i--){
if(result[i] != 0)
break;
}
for(int j = i; j >= 0; j--){
cout<<result[j];
}
return 0;
}
[分治]-大整数乘法
最新推荐文章于 2024-09-12 19:02:20 发布