学习笔记:高精度[模版] (vecor实现)

#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#define ll long long
#define up_b upper_bound
#define low_b lower_bound
#define m_p make_pair 
#define mem(a) memset(a,0,sizeof(a))
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
#include<algorithm>
using namespace std;


//高精+高精 
vector<int> addH(vector<int> &A,vector<int> &B)
{
    
    
	vector<int> C; 
	int t=0;
	for(int i=0;i<A.size()||i<B.size();i++)
	{
    
    
		if(i<A.size())	t+=A[i];
		if(i<B.size())	t+=B[i];
		C.push_back(t%10);
		t/=10;
	}
	if(t)	C.push_back(t);
	return C;
}

//高精+低精
vector<int> add(vector<int> &A,int b)
{
    
    
	vector<int> C;
	A[0]+=b;
	for(int i=0,t=0;i<A.size()||t;i++)
	{
    
    
		t+=A[i];
		C.push_back(t%10);
		t/=10;
	}
	return C;
}

//高精*高精
vector<int> mulH(vector<int> &A,vector<int> &B)
{
    
    
	int la=A.size(), lb=B.size();
	vector<int> C(la+lb,0);
	for(int i=0;i<la;i++)
		for(int j=0;j<lb;j++)	C[i+j]+=A[i]*B[j];
	int t=0;
	for(int i=0;i<C.size();i++)//进位 
	{
    
    	t+=C[i];
		C[i]=t%10;
		t/=10;
	}
	while(C.back()==0&&C.size()>1)	C.pop_back();//去零 
	return C;
}

//高精*低精
vector<int> mul(vector<int> &A,int b)
{
    
    
	vector<int> C;
	
	if(b==0)	{
    
     C.push_back(0); return C; }//特判 
	for(int i=0,t=0;i<A.size()||t;i++)
	{
    
    
		if(i<A.size()) t+=A[i]*b;
		C.push_back(t%10);
		t/=10;
	}
	return C;
}

//高精 ÷低精
vector<int> div(vector<int> &A,int b,int &r)//r为余数 
{
    
    
	vector<int> C;
	r=0;
	for(int i=A.size()-1;~i;i--)
	{
    
    
		r=r*10+A[i];
		C.push_back(r/b);
		r%=b;  
	}
	reverse(C.begin(),C.end());//得到的顺序是由高位到低位,为了方便,反转C 
	while(C.back()==0&&C.size()>1)	C.pop_back();//去零 
	return C;
}

//高精-高精
bool cmp(vector<int> &A,vector<int> &B)//比较A与B的大小 
{
    
    
	if(A.size()!=B.size())	return A.size()>B.size();
	for(int i=A.size()-1;~i;i--)
		if(A[i]!=B[i])	return A[i]>B[i];
	return true;
}
vector<int> subH(vector<int> &A,vector<int> &B) //满足A>=B>=0 
{
    
    
	vector<int> C;
	for(int i=0,t=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.back()==0&&C.size()>1)	C.pop_back();
	return C;
}
 
//高精度比较
vector<int> max_vec(vector<int> &A,vector<int> &B)
{
    
    
	if(A.size()>B.size())	return A;
	if(A.size()<B.size())	return B;
	//由高到低比较 
	if(vector<int> (A.rbegin(),A.rend()) > vector<int> (B.rbegin(),B.rend()))	return A;
	return B;
}

int main()
{
    
    
	string a;string b;//int b;
	vector<int> A,B,C;
	cin>>a>>b;
	for(int i=a.length()-1;~i;i--)	A.push_back(a[i]-'0');
	for(int i=b.length()-1;~i;i--)	B.push_back(b[i]-'0');
	//加 
	C=addH(A,B);
	for(int i=C.size()-1;~i;i--)	cout<<C[i];
	//减
	if(cmp(A,B))	C=subH(A,B);
	else	putchar('-'), C=subH(B,A);
	for(int i=C.size()-1;~i;i--)	cout<<C[i];
	//乘
	C=mulH(A,B);
	for(int i=C.size()-1;~i;i--)	cout<<C[i];
	//除
	//int r;
	//C=div(A,b,r);
    //for(int i=C.size()-1;~i;i--)	cout<<C[i];cout<<endl<<r;*/
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_50815157/article/details/113359012