算法说明:
1、将大整数逐位保存在整形数组里;
2、初始化结果数组为0,并预留足够的位数;
3、模拟竖式计算,并及时往高位进位(如果需要),并往高位方向逐一判断是否需要进位,直到某个不需要进位停止进位处理;
算法的C代码如下:
#include
#include
#include
int main()
{
/*第0位不参与计算,仅仅是为了方便下标识别*/
int a[ 721 ] = {0,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9};
int b[ 721 ] = {0,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9,5,2,5,8,7,4,4,6,9};
int c[ 1441 ] = {0};
int i, j, k = 0;
int temp;
clock_t start, end;
start = clock();
/* 模拟竖式计算,并及时进位,直至不需要再进位为止 */
for( i = 720; i > 0; i--)
{
for( j = 720; j > 0; j-- )
{
c[ i + j ] += b[ i ] * a[ j ];
/* 从该位往高位逐一判断是否需要进位 */
while( c[ i + j - k ] > 10 && ( i + j - k ) > 0 )
{
temp = c[ i + j - k ] % 10;
c[ i + j - k - 1 ] += ( c[ i + j - k ] - temp ) / 10;
c[ i + j - k ] = temp;
k++;
}
k = 0;
}
}
for( i = 1; i <= 1440; i++ )
{
printf( "%d", c[ i ] );
}
printf( "\n" );
end = clock();
printf("The time was: %f\n", (double)(end - start) / CLK_TCK);
return 1;
}
以上例子为 720位 × 720位,用时0.08S左右。
该算法的PHP版本
0; $i--)
{
for( $j = 720; $j > 0; $j-- )
{
$k = 0;
$c[ $i + $j ] += $b[ $i ] * $a[ $j ];
/* 从该位往高位逐一判断是否需要进位 */
while( $c[ $i + $j - $k ] > 10 && ( $i + $j - $k ) > 0 )
{
$temp = $c[ $i + $j - $k ] % 10;
$c[ $i + $j - $k - 1 ] += ( $c[ $i + $j - $k ] - $temp ) / 10;
$c[ $i + $j - $k ] = $temp;
$k++;
}
}
}
for( $i = 1; $i <= 1440; $i++ )
{
echo $c[ $i ];
}
echo " ";
echo microtime();
?>
在PHP命令行下用时1.32S
看来PHP和C的效率还是差了不止一个数量级~~