我正在尝试创建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;
}
答案 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。所以检查你的代数。