这个Karatsuba乘法算法实现有什么问题?

时间:2017-05-11 06:20:04

标签: c++ algorithm karatsuba

首先要做的事情:

〜这是我在StackOverflow上的第一个问题。

〜我是大学生。

〜这不是我的作业问题(我这样做是为了增加算法思维)。

这是我的实现,它继续返回错误的答案。我尝试过运行 GDB ,但是太缺乏经验,无法确定算法出错的地方。请帮忙:

#include <iostream>
#include <cmath>

using namespace std;

int equalize(string &num1, string &num2){  
    int len1 = num1.length();
    int len2 = num2.length();
    if (len1 < len2){
        for (int i = 0; i < len2 - len1; i++){
            num1 = '0' + num1;
        }
        return len2;
    } else{
        for (int i = 0; i < len1 - len2; i++){
            num2 = '0' + num2;
        }
        return len1;
    }
}

string add(string num1, string num2){
    string result;
    int length = equalize(num1, num2);
    int carryover = 0;
    for (int i = length - 1; i >= 0; i--){
        int a = num1[i] - '0';
        int b = num2[i] - '0';
        int sum = a + b + carryover;
        carryover = sum / 10;
        sum = sum % 10;
        result = to_string(sum) + result;
    }
    if (carryover)
        result = to_string(carryover) + result;
    return result;
}

long karatsuba(string num1, string num2){
    int n = equalize(num1, num2);
    if (n == 0)
        return 0;
    else if (n == 1){
        return (num1[0] - '0') * (num2[0] - '0');
    } else{
        int primary = n / 2;
        int secondary = n - primary;
        string A = num1.substr(0, primary);
        string B = num1.substr(primary, secondary);
        string C = num2.substr(0, primary);
        string D = num2.substr(primary, secondary);
        long AC = karatsuba(A, C);
        long BD = karatsuba(B, D);
        long ABCD = karatsuba(add(A, B), add(C, D));
        return ((AC * pow(10, 2 * primary)) + ((ABCD - AC - BD) * pow(10, primary)) + (BD));
    }
}

int main() {
    string a = "111", b = "111";
    cout << karatsuba(a, b);
    return 0;
}

返回的答案是441,理想情况下应为12321

0 个答案:

没有答案