大整數操作

九茶發表於2014-11-02
資料型別 長度(位) 取值範圍
char 8 ASCII字元
short 8 -128 ~ 127
int  16 -32768 ~ 32767
long 32 -2147483648 ~ 2147483647
float 32 -3.4e-38 ~ 3.4e+38
double 64 1.7e-308 ~ 1.7e+308
注:表中的長度和範圍的取值是假定CPU字長為16位。

問題解析:

如上表所示,long型資料最大能對21億以內的數字操作,可是如果兩個100億的數字相加,或者相乘呢?long型肯定不能滿足需求。如果是用在天文學的計算,數字更可能達到幾十位,甚至是幾百位的數字。這已經不可能再使用系統定義的資料型別了,那該怎麼解決?

主要思想:

不管是大整數相加,還是大整數相乘,都可以把一個數字的各位數字存進一個陣列裡面,然後再對陣列進行操作。就像小學時候的列豎式做加法或者乘法一樣。


具體例題:

(大數相加)
/*******
a和b存放要相加的兩個數的逆序,c將存放逆序的和,l為兩個加數位數取最大值。
例如320+427:a={0,2,3},b={7,2,4},l=3,計算結果c={7,4,7}。
*******/
int Adding(int a[],int b[],int c[],int l)
{
	int i,t;
	for(i=0;i<l;i++)
	{
		t=a[i]+b[i]+c[i];
		c[i]=t%10;
		c[i+1]=t/10;///////////進位
	}
	if(c[i]!=0)
		return i+1;
	return i;///////////////////函式返回陣列c的長度
}

(大數相乘)
<span style="font-size:18px;">/******* 
a和b存放要相乘的兩個數的逆序,c將存放逆序的積,la、lb分別為兩個乘數的位數。 
例如315*66:a={5,1,3},b={6,6},la=3,lb=2,計算結果c={0,9,7,0,2}。 
*******/ 
int Multiply(int a[],int b[],int c[],int la,int lb)
{
	int i,j,t;
	for(i=0;i<lb;i++)
		for(j=0;j<la;j++)
		{
			t=a[j]*b[i]+c[i+j];
			c[i+j]=t%10;
			c[i+j+1]+=t/10;////////////進位
		}
	if(c[la+lb-1]!=0)
		return la+lb;
	return la+lb-1;////////////////////函式返回乘積的位數
}</span>



— —PS:
第一篇部落格,格式不會編排,不免有些醜,見諒!
如果有什麼建議或者意見,請儘量提出。有什麼問題也可以在下面提出。
不斷地改錯是最快的成長方式,謝謝!


轉載請註明出處,謝謝!(原文連結:http://blog.csdn.net/bone_ace/article/details/40718331

相關文章