[分治]-大整数乘法

// 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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值