大數運算(整數的加法和乘法)

大家剛開學的時候肯定都做過A+B吧?今天給大家出一道A+Bplus:給定兩個整數AB,計算A + B的和。(AB的範圍都是01e1000 這道題我們還能用int或者longlong來做嗎?

這時候,由於AB的取值範圍遠遠大於數據類型給定的範圍,不能滿足較大規模的高精度數值計算,因此需要利用其他方法來實現高精度數值的計算,於是產生了大數運算。大數運算主要有加、減、乘這三種方法(當然大家也可以試着擴展一下其它(比如除法,取模,階乘等等)

對於本題(大數加法):

1 我們要用多大的數組存儲結果? 
 
2    如何在計算的過程中保證進位?

 
1 ,由於兩個數最大爲
1e1000,所以和的最大位數是2*1e1000,也就是長度爲1000的數組。 

2  , 在大數加減中執行完畢後再對存儲結果的result數組進行一次進位(因爲每位中兩個十以內的數相加最多隻進一位,結果累         積不會造成數據範圍溢出)

例如:

           8  1   3   5  7   3   8  7   2   5  8   9   7  1 + 3 2 9 4 8 1   3   0  9   1   8  9   0   4  9   5   0  1  8  =  3 29 4 8 9   4   3 (14) 8(11)(17)7   6(14)(13) 9  8  9

          最後進位,得:

  3  2 9 4 8 9   4  4   4    9  2   7   7 7   5    3  9   8  9

對於大數乘法:

1 我們要用多大的數組存儲結果? 
 
2    如何在計算的過程中保證進位?

 
1,如果兩個數最大爲
1e1000,所以乘積的最大位數是1e1000+1000),也就是長度爲2000的數組。 

2, 在大數乘法中可以定義一箇中間過程的二維數組,執行完畢後對每一列進行求和,得到結果,最後再對存儲結果的result數         組進行一次進位

例如:

             8      3      9      7      5

*                            9     3      8

=              (64) (24)  (72) (56) (40)

       (24)    9    (27)  (21) (15)

 (72) (27)  (81)  (63) (45)

也就是:

   7      8       7      6     8      5      5     0

我們來看一下代碼的實現:

//大數加法和乘法(整數運算) 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAX 1000
using namespace std;
char a[MAX],b[MAX],c[MAX],result[MAX]; 
int bignum_add(char* a,char* b,char* result)
{
	memset(c,0,sizeof(c));
	int len_a=strlen(a);
	int len_b=strlen(b);
	int flag=0,k=0;//進位標誌
	int i=len_a-1;
	int j=len_b-1;
	while(i>=0&&j>=0)
	{
		c[k]+=(a[i]+b[j]-2*'0'+flag)%10;
		flag=(a[i]+b[j]-2*'0'+flag)/10;//進位 
		i--;
		j--;
		k++;
	}
	c[k]+=flag;
	while(i>=0)
	{
		c[k++]+=a[i]-'0';
		i--;
	}
	while(j>=0)
	{
		c[k++]+=b[j]-'0';
		j--;
	}
	for(int i=0;i<k;i++)
	result[i]=c[k-i-1]+'0';
	result[k]=0;
	return k; 
}
int bignum_mutil(char* a,char* b,char* result)
{
	memset(c,0,sizeof(c));
	int len_a=strlen(a);
	int len_b=strlen(b);
	int flag,k;//進位標誌 
	for(int j=len_b-1;j>=0;j--)
	{
		k=len_b-1-j;
		flag=0;
		for(int i=len_a-1;i>=0;i--)
		{
			c[k]+=(b[j]-'0')*(a[i]-'0')+flag;
			flag=c[k]/10;//進位 
			c[k]=c[k]%10;
			k++;
		} 
		if(flag)
		c[k++]+=flag; 
	}
	for(int i=0;i<k;i++)
	result[i]=c[k-i-1]+'0';
	result[k]=0;
	return k;
}
int main()
{
	while(cin>>a>>b)
	{
	//	memset(c,0,sizeof(c));
		char c[MAX]={0}; 
		//大數加法 
		bignum_add(a,b,c);
		int len=strlen(c);
		int i;
		for(i=0;c[i]=='0';i++);//避免高位爲0 
		if(i>=len)
		cout<<0;
		else
		{
			for(i=i;i<len;i++)
			cout<<c[i];
		}
		cout<<endl; 
		//大數乘法 
		bignum_mutil(a,b,c);
	    len=strlen(c);
		for(i=0;c[i]=='0';i++);//避免高位爲0 
		if(i>=len)
		cout<<0;
		else
		{
			for(i=i;i<len;i++)
			cout<<c[i];
		}
		cout<<endl;
	}
return 0;	
} 








  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章