1. 程式人生 > 其它 >【演算法】高精度演算法

【演算法】高精度演算法

技術標籤:演算法演算法c++

看的視訊在這裡。

加法

思想:用陣列模擬高精度。
在這裡插入圖片描述

演算法核心:

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];

高精度減法例題的程式碼: