大家剛開學的時候肯定都做過A+B吧?今天給大家出一道A+Bplus版:給定兩個整數A和B,計算A + B的和。(A和B的範圍都是0~1e1000) 這道題我們還能用int或者longlong來做嗎?
這時候,由於A和B的取值範圍遠遠大於數據類型給定的範圍,不能滿足較大規模的高精度數值計算,因此需要利用其他方法來實現高精度數值的計算,於是產生了大數運算。大數運算主要有加、減、乘這三種方法(當然大家也可以試着擴展一下其它(比如除法,取模,階乘等等)
對於本題(大數加法):
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,所以乘積的最大位數是1e(1000+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;
}