zoukankan      html  css  js  c++  java
  • ACwing(基础)--- 高精度

    高精度加法

    // C = A + B, A >= 0, B >= 0
    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    vector<int > add(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(1);//剩余t如果为1则进位
    	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');
    
    	auto C = add(A,B);
    
    	for(int i=C.size()-1; i>=0; i--) printf("%d",C[i]);
    	return 0;
    }
    

    高精度减法

    // C = A - B, 满足A >= B, A >= 0, B >= 0
    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    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;//如果t小于0,表示借位了
    		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;
    }
    

    高精度乘低精度

    // C = A * b, A >= 0, b > 0
    // A / b = C ... r, A >= 0, b > 0
    
    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    vector<int> mul(vector<int> &A, int b){
    	vector<int> C;
    	int t=0;
    	for(int i=0;i<A.size()||t;i++){//注意:t如果不为0则继续
    		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;
    }
    
    int main() {
    	string a;
    	int b;
    	vector<int > A;
    	cin>>a>>b;
    	for(int i=a.size()-1; i>=0; i--) A.push_back(a[i]-'0');
    
    	auto C =mul(A,b);
    	
    	for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    	
    	return 0;
    }
    

    高精度除以低精度

    // A / b = C ... r, A >= 0, b > 0
    
    #include<iostream>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    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;
    }
    
  • 相关阅读:
    java synchronized
    [多问几个为什么]为什么匿名内部类中引用的局部变量和参数需要final而成员字段不用?(转)
    Java中static、final用法小结(转)
    使用 Spring 2.5 注释驱动的 IoC 功能(转)
    (转载)Spring 注解@Component,@Service,@Controller,@Repository
    Spring中@Autowired注解、@Resource注解的区别
    控制反转和依赖注入模式(转)
    HDU 4758 Walk Through Squares (2013南京网络赛1011题,AC自动机+DP)
    HDU 4745 Two Rabbits (2013杭州网络赛1008,最长回文子串)
    HDU 4747 Mex (2013杭州网络赛1010题,线段树)
  • 原文地址:https://www.cnblogs.com/bingers/p/13223936.html
Copyright © 2011-2022 走看看