【演算法】高精度演算法
阿新 • • 發佈:2021-02-08
加法
思想:用陣列模擬高精度。
演算法核心:
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
注意:是c[i]+=a[i]+b[i],是累加。
例題:求a+b, a、b範圍都<=10^500;
注意:
1、將字串轉成陣列模擬大數時要將字元轉置,這樣才方便做加法,因為數學是向右對齊做加法的,而陣列是從左到右的。如:
1234+789==1234+0789 對齊相加,而不是1234+7890對齊相加。
故轉置即向右對齊,這樣進位就向左(向小的位置)進位。
2、la-i最大是la,最小是1.故後面的核心演算法是從1開始到lc;
程式碼如下(有註釋):
#include<bits/stdc++.h>
using namespace std;
char s1[505],s2[505];
int a[505],b[505],c[505];
int main()
{
//用陣列模擬高精度演算法
int la,lb,lc;
cin>>s1>>s2;
//得知長度
la=strlen(s1);
lb=strlen(s2);
//將字元轉為數字,並將字元轉置便於計算
//此時數字是倒過來的,因為數字的加法是從低位向高位相加(向右對齊)
for(int i=0;i<la;i++)
{
a[la-i]=s1[i]-'0';
}
for(int i=0;i<lb;i++)
{
b[lb-i]=s2[i]-'0';
}
//最高位數
lc=max(la,lb)+1;
//核心步驟
for(int i=1;i<=lc;i++) //為什麼從1開始?因為上面的la-i最小就是1
{
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
//刪除前導0
if(c[lc]==0&&lc>0) lc--;
for(int i=lc;i>0;i--)
{
cout<< c[i];
}
return 0;
}
減法
演算法核心:
1、若a<b,則交換a與b,並在結果處加上負號。
2、如果a[i]<b[i],則需要高位借位。
核心程式碼:
if(a[i]<b[i])
{
a[i+1]--;
a[i]=a[i]+10;
}
c[i]=a[i]-b[i];
高精度減法例題的程式碼: