一: 高精度加法
1. P1601 A+B Problem(高精)
模板
代码:
#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
模板
代码:
#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 提高组] 国王游戏
高精乘法 高精除法
高精度比大小
模板 高精
低精
代码:
#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;
}