大整数相乘算法(C语言、PHP)实现


算法说明:
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的效率还是差了不止一个数量级~~


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注