• 高精度


    高精度

    • 高精度是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;	
    } 
    
  • 相关阅读:
    网络知识
    DXP 技巧和龙芯3A装机
    312-金胜维 P系列2.5寸 480G SATA3 SSD固态硬盘
    NVIDIA Jetson TK1 开发板
    NVIDIA Jetson™ TX1
    XILINX FPGA 开发板 XC3S250E 核心板 学习板+12模块
    AES-OZ745 OZ745 Zynq-7000 开发板与套件
    北京太速科技——海外代购
    AR/VR增强现实 虚拟现实,嵌入式解决方案探讨
    270-VC709E 增强版 基于FMC接口的Xilinx Vertex-7 FPGA V7 XC7VX690T PCIeX8 接口卡
  • 原文地址:https://www.cnblogs.com/codertea/p/13369021.html
Copyright © 2020-2023  润新知