大数模板我统一用字符串形式string
大数相加
#include<bits/stdc++.h>
using namespace std;
string a,b;
string add(string a,string b){
if(a.size()<b.size()) return add(b,a);
string A,B,C,c;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]);
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]);
int t=0;
for(int i=0;i<A.size();i++){
t+=A[i]-'0';
if(i<B.size()) t+=B[i]-'0';
C.push_back(t%10+'0');
t/=10;
}
if(t) C.push_back(t+'0');
int cot=C.size()-1;
while(cot>=0) c.push_back(C[cot--]);
A.clear(); B.clear(); C.clear();
return c;
}
int main(){
cin>>a>>b;
string f=add(a,b);
cout<<f;
}
大数相乘
#include <bits/stdc++.h>
using namespace std;
string a,b;
const int MAXN=10005;
string mult(string A,string B){
int x[MAXN],y[MAXN],z[MAXN<<1];
string c;
memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); memset(z,0,sizeof(z));
for(int i=A.size()-1,cnt=0;i>=0;i--) x[cnt++]=A[i]-'0';
for(int i=B.size()-1,cnt=0;i>=0;i--) y[cnt++]=B[i]-'0';
for(int i=0;i<A.size();i++) for(int j=0;j<B.size();j++) z[i+j]+=x[i]*y[j];
for(int i=0;i<MAXN*2;i++){
if(z[i]>=10){
z[i+1]=z[i+1]+z[i]/10;
z[i]=z[i]%10;
}
}
int cot=MAXN*2-1;
while(z[cot]==0) cot--;
while(cot>=0) c.push_back(z[cot--]+'0');
return c;
}
int main(){
cin>>a>>b;
string f=mult(a,b);
cout<<f;
}
将整型换成string
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
string change(ll i){
string a,b;
while(i){
b.push_back(i%10+'0');
i/=10;
}
int cot=b.size()-1;
while(cot>=0) a.push_back(b[cot--]);
b.clear();
return a;
}
int main(){
cin>>n;
string f=change(n);
cout<<f;
}
大数相减
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
string BigSub(string a,string b){
if(a==b) return "0";
int singnal=0;
int len1=a.size();
int len2=b.size();
if(len1<len2||len1==len2&&a<b){
string c=a;
a=b;
b=c;
singnal=1;
}
int i,n=len1-len2;
for(i=len2-1;i>=0;i--) a[len1-1-i]='0'+a[len1-1-i]-b[len2-1-i];
for(i=len1-1;i>=0;i--){
if(a[i]<'0'){
a[i] +=10;
a[i-1]--;
}
}
i=0;
while('0'==a[i]) i++;
a.erase(0,i);
if(singnal) a='-'+a;
return a;
}
int main(){
string str1,str2;
cin>>str1>>str2;
string f=BigSub(str1,str2);
cout<<f;
}
大数相除
(这里result为商,s为余数,还要考虑前导零,本质还是大数减法)
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
bool Compare(string first,string second){
int i=0; while('0'==first[i]) i++; first.erase(0,i);
i=0; while('0'==second[i]) i++; second.erase(0,i);
int len1=first.size();
int len2=second.size();
if(len1<len2) return false;
else if(len1==len2&&first<second) return false;
return true;
}
string Subtraction(string s1,string s2){
if(s1==s2) return "0";
int len1=s1.size();
int len2=s2.size();
for(int i=len2-1;i>=0;i--) s1[len1-1-i]='0'+s1[len1-1-i]-s2[len2-1-i];
for(int i=len1-1;i>=0;i--){
if(s1[i]<'0'){
s1[i]+=10;
s1[i-1]--;
}
}
int i=0; while(s1[i]=='0')i++; s1.erase(0,i);
return s1;
}
void BigDivision(string a,string b){
string result,s;
int count,i;
if("0"==b){
cout<<"NULL"<<endl;
return;
}
if(!Compare(a,b)){
cout<<0<<" "<<a<<endl;
return;
}
int len=a.size();
for(int i=0;i<len;i++){
count=0;
s.push_back(a[i]);
while(Compare(s,b)){
s=Subtraction(s,b);
count++;
}
result+=char(count+'0');
}
i=0; while('0'==result[i]) i++; result.erase(0,i);
i=0; while('0'==s[i]) i++; s.erase(0,i);
cout<<result<<" "<<s<<endl;
}
int main(){
string str1,str2;
cin>>str1>>str2;
BigDivision(str1,str2);
}
大数阶乘
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const int maxn=1e5+7;
string fac(int n){
string ans;
if(n==0) return "1";
int a[maxn];
memset(a,0,sizeof(a));
int s=0,m=n;
while(m) a[++s]=m%10,m/=10;
for(int i=n-1;i>=2;i--){
int w=0;
for(int j=1;j<=s;j++) a[j]=a[j]*i+w,w=a[j]/10,a[j]=a[j]%10;
while(w) a[++s]=w%10,w/=10;
}
while(!a[s]) s--;
while(s>=1) ans+=a[s--]+'0';
return ans;
}
int main(){
int n;
cin>>n;
cout<<fac(n)<<endl;
}
以上代码都是在输入的是非负数的情况下。如果遇到负数,减变加,乘或除后前面加个‘-’。
顺便提一下,一般高精度的题出的数据格外大(注意是超级大),如果遇到数据在1e18附近,复杂度在n^2, n^3等等类似情况在long long int最大值下面的,尽量用long long int,别用高精度。
附张表ing
unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 0~4294967295
long -2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615