1. 程式人生 > >大整數相乘問題

大整數相乘問題

看到一道經典的面試題目---大整數相乘問題,完完整整敲了一遍,並且在牛客網運行了一遍,AC過了。

所採用的的方法是進位的方法。

舉個例子:

用 789 × 956 ,通過計算我們很容易得到 754284 , 除了筆算或者口算的方法我們還可以用一種非常巧妙的方法來進行計算。

這個方法的過程是這樣子的:

  • 首先將 9 乘以 789 的每一位數字,得到:                             ( 81 ) ( 72 )( 63 )
  • 然後將 5 乘以 789 的每一位數字,得到:               ( 45 ) ( 40 ) ( 35 )
  • 最後將 6 乘以 789 的每一位數字,得到:( 54 )  ( 48 ) ( 42 )

各項相加 得到  54 93 163 107 63

得到的數我們將其存放在一個數組裡面,這個陣列的名字是自定義的,我這裡將其定義成ret

ret[0] = 54;

ret[1] = 93;

等等。

開始進行進位操作:

ret[1] --->  93 + 54/10 = 98;

ret[0] = 54%10 = 4;

163 = 163 + 98/10 = 172; 

ret[1] = 98%10 = 8;

以此類推:

最後得到的結果為:

ret[5] = 7;

ret[4] = 5; 

ret[3] = 4;

ret[2] = 2;

ret[1] = 8;

ret[0] = 4; 

這就是我們得到的結果,這只是提供個思路,具體的程式碼如下:

#include <iostream>
#include <memory.h>
#define SIZE 11000
using namespace std;

//進行兩個數相乘,完成以後返回字串 
string multi(int *num1,int size1,int *num2,int size2)
{
	string s;
	int ret[SIZE];
	int i,j,k;
	int size = size1+size2; 
	fill(ret,ret+SIZE,0);

	//乘法
	//將第二個陣列中的一位上的數字分別與第一個陣列的所有位相乘
	//ret用於進位 
	for(i = 0;i<size2;i++)
	{
		k = i;
		for(j = 0;j<size1;j++)
			ret[k++] += num1[j] * num2[i];
	}
	
	//進位求餘 
	for(i = 0;i<=size;i++)
	{
		ret[i+1] += ret[i]/10;
		ret[i] %= 10;	
	}
	
	if(ret[size]) 
		s+=ret[size]+'0';

    for(i=size-1;i>=0;i--) 
        s+=ret[i]+'0';
    return s;
}


int main()
{
	string number1,number2;
	
	while(cin>>number1>>number2)
	{
	int i,j = 0;
	int size1,size2;
	int num1[SIZE],num2[SIZE];
	//將定義的陣列初始化為 0 
	fill(num1,num1+SIZE,0);
	fill(num2,num2+SIZE,0);
	
	size1 = number1.size();
	size2 = number2.size();
	
	for(i = size1-1;i>=0;i--)
		num1[i] = number1[j++] - '0';
	
	i = 0;
	for(j = size2-1;j>=0;j--)
		num2[j] = number2[i++] - '0';
	
	string s = multi(num1,size1,num2,size2);
	if(s[0]=='0')
	{ 
		for(i=1;i<=s.size();i++)
			cout<<s[i];
		cout<<endl;
	} 
	if(s[0]!='0')
		cout<<s<<endl;
	}
}