请姚先生帮助看一下
这个的错误所在
void karatsuba(LARGE_INT * a,LARGE_INT * b,LARGE_INT * ret,LARGE_INT d )
{
long i;
LARGE_INT * ar = & a[0]; // low-order half of a
LARGE_INT * al = & a[d / 2]; // high-order half of a
LARGE_INT * br = & b[0]; // low-order half of b
LARGE_INT * bl = & b[d / 2]; // high-order half of b
LARGE_INT * asum;// = & ret[d * 5]; // sum of a's halves
LARGE_INT * bsum;// = & ret[d * 5 + d / 2]; // sum of b's halves
LARGE_INT * x1 = & ret[d * 0]; // ar*br's location
LARGE_INT * x2 = & ret[d * 1]; // al*bl's location
LARGE_INT * x3;// = & ret[d * 2]; // asum*bsum's location
asum = new LARGE_INT[d / 2];
bsum = new LARGE_INT[d / 2];
x3 = new LARGE_INT[d];
// when d is small, we're better off just reverting to
// grade-school multiplication, since it's faster at this po LARGE_INT.
if ( d <= KARAT_CUTOFF )//KARAT_CUTOFF = 4
{
gradeSchool( a, b, ret, d );
return;
}
// compute asum and bsum
for ( i = 0; i < d / 2; i++ )
{
asum[i] = al[i] + ar[i];
bsum[i] = bl[i] + br[i];
}
karatsuba( ar, br, x1, d / 2 );
karatsuba( al, bl, x2, d / 2 );
karatsuba( asum, bsum, x3, d / 2 );
// combine recursive steps
for ( i = 0; i < d; i++ ) x3[i] = x3[i] - x1[i] - x2[i];
for ( i = 0; i < d; i++ ) ret[i + d / 2] += x3[i];
delete[]x3;
delete[]bsum;
delete[]bsum;
}
void gradeSchool(LARGE_INT * a,LARGE_INT * b,LARGE_INT * ret,LARGE_INT d )
{
long i, j;
for ( i = 0; i < 2 * d; i++ ) ret[i] = 0;
for ( i = 0; i < d; i++ )
{
for ( j = 0; j < d; j++ ) ret[i + j] += a[i] * b[j];
}
}
//------------------------------------------------------------------------------
void doCarry(LARGE_INT * a,LARGE_INT d )
{
LARGE_INT c;
long i;
c = 0;
for ( i = 0; i < d; i++ )
{
//printf("%016u ",a[i]);
a[i] += c;
if ( a[i] < 0 )
{
c = -( -( a[i] + 1 ) / RADIX + 1 );
}
else
{
c = a[i] / RADIX;
}
a[i] -= c * RADIX;
//printf("%09u ",a[i]);
//printf("%09u\n",c);
}
if ( c != 0 ) fprintf( stderr, "Overflow %d\n", c );
}
这是他人的代码,本身是10进制,我修改成10^9进制,但是当d大于或等于32后,计算结果是错误的
+ — * 已经可以计算了,虽然可能有错误
另外,有一个地方有性能缺陷
就是不能实现
number t = new number(number b)的拷贝构造函数
只能用number t; t = b;代替
一旦b超过初始的1024DWORD大小,可能有内存重新分配的发生 :(
我的C++水平太菜,请教大家如何改进