zoukankan      html  css  js  c++  java
  • 高精度

    高精度

    • 高精度是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;	
    } 
    
  • 相关阅读:
    菜鸟小结
    计算几何题目整理(转)
    poj 3299 Humidex
    基于C的文件操作(转)
    poj 1328 Radar Installation
    poj 1321 棋盘问题(dfs)
    poj 3302 Subsequence
    C# 资产(Property) 与普通字段(field)变量的区别
    Jumping into Cloud, Be Sure You Know How to Get Out
    关于语言的想法。
  • 原文地址:https://www.cnblogs.com/codertea/p/13369021.html
Copyright © 2011-2022 走看看