高精度学习笔记

一: 高精度加法

1. P1601 A+B Problem(高精)

模板 A+B

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=510;
string s1,s2;
vector<int> add(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);
		t=t/10;
	}
	if(t) C.push_back(t);
	return C;
}

vector<int> A,B,C;
int main(){
	cin>>s1>>s2;
	for(int i=s1.size()-1;i>=0;i--){
		A.push_back(s1[i]-'0');
	}
	for(int i=s2.size()-1;i>=0;i--)
		B.push_back(s2[i]-'0');
	if(A.size()<B.size()) C=add(B,A);
	else C=add(A,B);
	for(int i=C.size()-1;i>=0;i--)
		printf("%d",C[i]);
	return 0;
}

二: 高精度减法

例题:

1. P2142 高精度减法
#include<bits/stdc++.h>
using namespace std;
int check(vector<int> A,vector<int> B){
	if(A.size()>B.size()) return 1;
	else if(A.size()<B.size()) return 0;
	for(int i=A.size()-1;i>=0;i--){
		if(A[i]==B[i]) continue;
		if(A[i]<B[i]) return 0;
		else return 1;
	}
	return 1;
}
vector<int> sub(vector<int> A,vector<int> B){
	int t=0;
	vector<int> C;
	for(int i=0;i<A.size();i++){
//		printf("%d %d\n",A[i],B[i]);
		if(i>=B.size())
			C.push_back(A[i]);
		else C.push_back(A[i]-B[i]);
	}
	for(int i=0;i<C.size();i++){
		if(C[i]<0){
			C[i+1]--;
			C[i]=10+C[i];
		}
	}
	while(C.size()>=2&&C[C.size()-1]==0) C.pop_back();
	return C;
}
string s1,s2;
int main(){
	vector<int> A,B,C;
	cin>>s1>>s2;
	for(int i=s1.size()-1;i>=0;i--)
		A.push_back(s1[i]-'0');
	for(int i=s2.size()-1;i>=0;i--)
		B.push_back(s2[i]-'0');
	int f=1;
	if(check(A,B)){
		f=1;
		C=sub(A,B);
	}
	else{
		f=-1;
		C=sub(B,A);
	}
	if(f==-1) printf("-");
	for(int i=C.size()-1;i>=0;i--)
		printf("%d",C[i]);
	printf("\n");
	return 0;
}

三: 高精度乘法

例题:

1. P1303 A*B Problem

模板 A\times B

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
string s1,s2;
vector<int> mul(vector<int> A,vector<int> B){
	int t=0,lena=A.size(),lenb=B.size(); 
	vector<int> C(lena+lenb);
	for(int i=0;i<A.size();i++){
		for(int j=0;j<B.size();j++){
			t=A[i]*B[j]+C[i+j]+t;
			C[i+j]=t%10;
			t/=10;
		}
		int j=B.size();
		if(t>0){
			C[i+j]=C[i+j]+t%10;
			t/=10; 
		}
	}
	while(C.size()>1&&C[C.size()-1]==0) C.pop_back();
	return C;
}
vector<int> A,B;
int main(){
	cin>>s1>>s2;
	for(int i=s1.size()-1;i>=0;i--) A.push_back(s1[i]-'0');
	for(int i=s2.size()-1;i>=0;i--) B.push_back(s2[i]-'0');
	vector<int> C;
	C=mul(A,B);
	for(int i=C.size()-1;i>=0;i--)
		printf("%d",C[i]);
	return 0;
}

2. P1005 [NOIP2007 提高组] 矩阵取数游戏

“最优子段和” + 高精度乘法 + 高精度加法 + 高精度比大小

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=100;
int a[N];
vector<int> P2[100];
vector<int> change(int x){
	vector<int> A;
	while(x){
		A.push_back(x%10);
		x/=10;
	}
	return A;
}
vector<int> mul(vector<int> A,vector<int> B){
	int t=0,lena=A.size(),lenb=B.size();
	vector<int> C(lena+lenb);
	for(int i=0;i<A.size();i++){
		for(int j=0;j<B.size();j++){
			t=C[i+j]+A[i]*B[j]+t;
			C[i+j]=t%10;
			t/=10;
		}
		int j=B.size();
		if(t){
			C[i+j]=t%10;
			t/=10;
		}
	}
	while(C.size()>1&&C[C.size()-1]==0) C.pop_back();
	return C;	
}
vector<int> add(vector<int> A,vector<int> B){
	if(A.size()<B.size()) return add(B,A);
	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);
		t=t/10;
	}
	while(t){
		C.push_back(t%10);
		t/=10;
	}
	return C;
}
vector<int> maxx(vector<int> A,vector<int> B){
	if(A.size()>B.size()) return A;
	else if(B.size()>A.size()) return B;
	for(int i=A.size()-1;i>=0;i--){
		if(A[i]>B[i]) return A;
		else if(B[i]>A[i]) return B;
	}
	return A;
}
int idx[N];
int n,m;
vector<int> f[N][N],ans;
void init(){
	f[0][m].clear(); f[1][m+1].clear();
}
int main(){
	scanf("%d%d",&n,&m);
	P2[1].push_back(2);
	for(int i=2;i<=m;i++){
		P2[i]=mul(P2[i-1],change(2));
	}
	ans.push_back(0);
	while(n--){
		for(int i=1;i<=m;i++) scanf("%d",&a[i]);
		init();
		vector<int> maxn;
		maxn.push_back(0);
		for(int i=1;i<=m;i++){
			for(int j=m;j>=i;j--){
				auto A1=change(a[i-1]),A2=change(a[j+1]);
				auto C1=mul(A1,P2[m-(j-i+1)]),C2=mul(A2,P2[m-(j-i+1)]);
				auto t1=add(f[i-1][j],C1),t2=add(f[i][j+1],C2);
				f[i][j]=maxx(t1,t2);
			}
			auto A=change(a[i]);
			auto C=mul(A,P2[m]);
			auto t=add(f[i][i],C);
			maxn=maxx(maxn,t);
		}
		ans=add(ans,maxn);
	}
	for(int i=ans.size()-1;i>=0;i--)
		printf("%d",ans[i]);
	return 0;
}

四:高精度除法

例题:

1. P1080 [NOIP2012 提高组] 国王游戏

高精乘法 + 高精除法 + 高精度比大小

模板 高精 A \div 低精 B

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
struct node{
	int a,b;
}d[N];
int n;
bool cmp(node x,node y){
	return x.a*x.b<y.a*y.b;
}
vector<int> maxx(vector<int> A,vector<int> B){
	if(A.size()>B.size()) return A;
	else if(A.size()<B.size()) return B;
	for(int i=A.size()-1;i>=0;i--){
		if(A[i]>B[i]) return A;
		else if(B[i]>A[i]) return B;
	}
	return A;
}
vector<int> change(int x){
	vector<int> res;
	while(x){
		res.push_back(x%10);
		x/=10;
	}
	return res;
}
vector<int> mul(vector<int> A,vector<int> B){
	int t=0,lena=A.size(),lenb=B.size();
	vector<int> C(lena+lenb);
	for(int i=0;i<A.size();i++){
		for(int j=0;j<B.size();j++){
			t=C[i+j]+A[i]*B[j]+t;
			C[i+j]=t%10;
			t/=10;
		}
		int j=B.size();
		if(t){
			C[i+j]=t%10;
			t/=10;
		}
	}
	while(C.size()>1&&C[C.size()-1]==0) C.pop_back();
	return C;	
}
vector<int> div(vector<int> A,int B){
	vector<int> C;
	int t=0;
	for(int i=A.size()-1;i>=0;i--){
		t=t*10+A[i];
		C.push_back(t/B);
		t%=B;
	}
	reverse(C.begin(),C.end());
	while(C.size()>1&&C[C.size()-1]==0) C.pop_back();
	return C;
}
int main(){
	scanf("%d",&n);
	scanf("%d%d",&d[0].a,&d[0].b);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&d[i].a,&d[i].b);
	sort(d+1,d+1+n,cmp);
	vector<int> tmp,res,ans;
	res=change(d[0].a);
	for(int i=1;i<=n;i++){
		tmp=div(res,d[i].b);
		ans=maxx(ans,tmp);
		res=mul(res,change(d[i].a));
	}
	for(int i=ans.size()-1;i>=0;i--)
		printf("%d",ans[i]);
	return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值