长整数乘以整数

时间:2014-03-04 05:19:36

标签: c++ algorithm math

我正在尝试创建long int multiplication函数。在数学中乘以2个数字,例如123 X 456,我做:

(12 * 10^1 + 3)( 45 * 10^1 + 6) = 
(540 * 10^2) + (72 * 10^1) + (135 * 10^1) + 18 = 15129

我为此算法创建了一个小程序,但它无法正常工作。

我不知道我的问题在哪里。你能帮我理解和纠正吗?

TNX

int digits(int n) {
    int digit = 0;
    while (n>0){
        n/=10;
        digit++;
    }
    return digit;
}

long int longMult(long int a, long int b) {
    long int x,y,w,z;
    int digitA = digits(a);
    int digitB = digits(b);

    if((a==0) || (b==0)) {
        return 0;
    } else if (digitA < 2 || digitB < 2) {
        return a*b;
    } else {
        int powA = digitA / 2;
        int powB = digitB / 2;

        //for first number
        x = a/(10^powA);
        y = a%(10^powA);

        //for second number
        w = b/(10^powB);
        z = b%(10^powB);

        return ( longMult(x,w)*(10^(powA*powB)) + longMult(x,z) +
                 longMult(w,y)*(10^(powA*powB)) + longMult(y,z));
    }
}

int main()
{
    cout << digits(23) << endl; // for test
    cout << longMult(24,24); // must be 576 but output is 96
    return 0;
}

1 个答案:

答案 0 :(得分:4)

表达式

10^powA 

做一个按位排他或者,并且不会像你期望的那样将功率提高到10。

您可能想要定义类似

的内容
long powli(int b, long e) {return e?b*powli(b,e-1):1;}

然后你可以使用

powli(10,powA)

编辑:组合值的方式也存在问题:

    return ( longMult(x,w)*(10^(powA*powB)) + longMult(x,z) +
             longMult(w,y)*(10^(powA*powB)) + longMult(y,z));

查看数学,因为乘以指数几乎没有意义。

对值的调整组合也是错误的,例如(10 * a + b)(10 * c + d)= 10 * 10 * a * c + 10 * a * d + 10 * b * d + b * D。所以检查你的代数。