1. 程式人生 > 實用技巧 >高精度

高精度

高精度

  • 高精度是C++需要學習的內容,Java和Python沒有必要學習這個內容。

  • 使用情況:A+B 其中len(A或B)<=1e6

    ​ A-B 其中len(A或B)<=1e6 保證A>=B

    ​ A*α 其中len(A)<=1e6 α<=1e9

    ​ A/α 其中len(A)<=1e6 α<=1e9

演算法思想:

大整數的儲存:把位數超級長的大數儲存在陣列中,想清楚,是陣列的低位儲存大數的個位,這樣儲存是為了方便實現進位。

大整數的運算:模擬人工手算的過程

程式碼實現:

//A+B   其中len(A或B)<=1e6
vector<int> add(vector<int> &A,vector<int> &B)
{
	vector<int> C;
    if(A.size()<B.size()) return add(B,A);
	int t=0;
	for(int i=0;i<A.size();i++)
	{
		t+=A[i];
		if(i<B.size()) t+=B[i];
		C.push_back(t%10);
		t/=10;
	}
	if(t) C.push_back(1);
	return C;
}

//A-B   其中len(A或B)<=1e6      保證A>=B
//判斷是否有A>=B 
bool cmp(vector<int> &A,vector<int> &B)
{
	if(A.size()!=B.size()) return A.size()>B.size();
	for(int i=A.size()-1;i>=0;i--)
		if(A[i]!=B[i])	return A[i]>B[i]; 
	return true;
}
vector<int> sub(vector<int> &A,vector<int> &B)
{
	vector<int> C;
	int t=0;
	for(int i=0;i<A.size();i++)
	{
		t=A[i]-t;
		if(i<B.size()) t-=B[i];
		C.push_back((t+10)%10);
		if(t<0) t=1;
		else t=0;
	} 
	while(C.size()>1&&C.back()==0) C.pop_back();
	return C;
}
int main()
{
	string a,b;
	vector<int> A,B;
	cin>>a>>b;
	for(int i=a.size()-1;i>=0;i--)
	{
		A.push_back(a[i]-'0');
	}
	for(int i=b.size()-1;i>=0;i--)
	{
		B.push_back(b[i]-'0');
	}
	if(cmp(A,B))
	{
		auto C=sub(A,B);
		for(int i=C.size()-1;i>=0;i--)
		{
			printf("%d",C[i]);
		}
	} 	
	else
	{
		auto C=sub(B,A);
		printf("-");
		for(int i=C.size()-1;i>=0;i--)
		{
			printf("%d",C[i]);
		}
	}
	return 0;
}

//A*α  其中len(A)<=1e6     α<=1e9   把B看成整體,用A的每一位乘B
vector<int> mul(vector<int> &A,int b)
{
	vector<int> C;
	int t=0;
	for(int i=0;i<A.size()||t;i++)
	{
		if(i<A.size())	t += A[i]*b;
		C.push_back(t%10);
		t /= 10;
	}
	while(C.size()>1&&C.back()==0) C.pop_back();
	return C;
}

//A/α  其中len(A)<=1e6     α<=1e9 	A/b 商C 餘數r 
vector<int> div(vector<int> &A,int b,int &r)
{
	vector<int> C;
	r = 0;
	for(int i=A.size()-1;i>=0;i--)
	{
		r = r *10+A[i];
		C.push_back(r/b);
		r %= b;
	}
	reverse(C.begin(),C.end());
	while(C.size()>1&&C.back()==0) C.pop_back();
	return C;
}
int main()
{
	string a;
	int b;
	cin>>a>>b;
	vector<int> A;
	for(int i=a.size()-1;i>=0;i--)
	{
		A.push_back(a[i]-'0');
	}
	int r;	//餘數 
	auto C=div(A,b,r);
	for(int i=C.size()-1;i>=0;i--)
	{
		printf("%d",C[i]);
	} 
	cout<<endl<<r<<endl; 
	return 0;	
}