
1
long
mult(
long
x,
long
y,
int
n)
2 {
3 long a, b, c, d, s;
4 s = Math.Sign(x) * Math.Sign(y);
5 x = Math.Abs(x);
6 y = Math.Abs(y);
7 if (n == 1 )
8 return s * x * y;
9 else
10 {
11 // XY=AC*10^4+ [AC + (A-B) (D-C) + BD] *10^2+BD
12 a = ( long )(x / Math.Pow( 10 , (n / 2 ))); // 取x的左半部分
13 b = ( long )(x % ( long )(Math.Pow( 10 , (n / 2 )))); // 取x的右半部分
14 c = ( long )(y / Math.Pow( 10 , (n / 2 ))); // 取y的左半部分
15 d = ( long )(y % ( long )(Math.Pow( 10 , (n / 2 )))); // 取y的右半部分
16 long m1 = mult(a, c, n / 2 ); // AC
17 long m2 = mult(a - b, d - c, n / 2 ); // (A-B)(D-C)
18 long m3 = mult(b, d, n / 2 ); // BD
19 s = s * (m1 * ( long )Math.Pow( 10 , n) + (m1 + m2 + m3) * ( long )Math.Pow( 10 , n / 2 ) + m3);
20 return (s);
21 }
22 }
2 {
3 long a, b, c, d, s;
4 s = Math.Sign(x) * Math.Sign(y);
5 x = Math.Abs(x);
6 y = Math.Abs(y);
7 if (n == 1 )
8 return s * x * y;
9 else
10 {
11 // XY=AC*10^4+ [AC + (A-B) (D-C) + BD] *10^2+BD
12 a = ( long )(x / Math.Pow( 10 , (n / 2 ))); // 取x的左半部分
13 b = ( long )(x % ( long )(Math.Pow( 10 , (n / 2 )))); // 取x的右半部分
14 c = ( long )(y / Math.Pow( 10 , (n / 2 ))); // 取y的左半部分
15 d = ( long )(y % ( long )(Math.Pow( 10 , (n / 2 )))); // 取y的右半部分
16 long m1 = mult(a, c, n / 2 ); // AC
17 long m2 = mult(a - b, d - c, n / 2 ); // (A-B)(D-C)
18 long m3 = mult(b, d, n / 2 ); // BD
19 s = s * (m1 * ( long )Math.Pow( 10 , n) + (m1 + m2 + m3) * ( long )Math.Pow( 10 , n / 2 ) + m3);
20 return (s);
21 }
22 }
以下是另一种解法,但不是最好:

int
fun(
int
[] a,
int
[] b)
{
int sum = 0 ;
for ( int j = b.Length - 1 ; j >= 0 ; j -- )
{
int s = 0 ;
for ( int i = a.Length - 1 ; i >= 0 ; i -- )
{
s += a[i] * b[j] * ( int )Math.Pow( 10 , a.Length - 1 - i);
}
sum += s * ( int )Math.Pow( 10 , b.Length - 1 - j);
}
return sum;
}
{
int sum = 0 ;
for ( int j = b.Length - 1 ; j >= 0 ; j -- )
{
int s = 0 ;
for ( int i = a.Length - 1 ; i >= 0 ; i -- )
{
s += a[i] * b[j] * ( int )Math.Pow( 10 , a.Length - 1 - i);
}
sum += s * ( int )Math.Pow( 10 , b.Length - 1 - j);
}
return sum;
}