【高精度】模板 (C++)
//n为长度
1、高精加
复杂度:O(n)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int L=;
string add(string a,string b)//只限两个非负整数相加
{
string ans;
int na[L]={},nb[L]={};
int la=a.size(),lb=b.size();
for(int i=;i<la;i++) na[la--i]=a[i]-'';
for(int i=;i<lb;i++) nb[lb--i]=b[i]-'';
int lmax=la>lb?la:lb;
for(int i=;i<lmax;i++) na[i]+=nb[i],na[i+]+=na[i]/,na[i]%=;
if(na[lmax]) lmax++;
for(int i=lmax-;i>=;i--) ans+=na[i]+'';
return ans;
}
int main()
{
string a,b;
while(cin>>a>>b) cout<<add(a,b)<<endl;
return ;
}
2、高精减
复杂度:O(n)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int L=;
string sub(string a,string b)//只限大的非负整数减小的非负整数
{
string ans;
int na[L]={},nb[L]={};
int la=a.size(),lb=b.size();
for(int i=;i<la;i++) na[la--i]=a[i]-'';
for(int i=;i<lb;i++) nb[lb--i]=b[i]-'';
int lmax=la>lb?la:lb;
for(int i=;i<lmax;i++)
{
na[i]-=nb[i];
if(na[i]<) na[i]+=,na[i+]--;
}
while(!na[--lmax]&&lmax>) ;lmax++;
for(int i=lmax-;i>=;i--) ans+=na[i]+'';
return ans;
}
int main()
{
string a,b;
while(cin>>a>>b) cout<<sub(a,b)<<endl;
return ;
}
3、高精乘
复杂度:O(n*n)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int L=;
string mul(string a,string b)//高精度乘法a,b,均为非负整数
{
string s;
int na[L],nb[L],nc[L],La=a.size(),Lb=b.size();//na存储被乘数,nb存储乘数,nc存储积
fill(na,na+L,);fill(nb,nb+L,);fill(nc,nc+L,);//将na,nb,nc都置为0
for(int i=La-;i>=;i--) na[La-i]=a[i]-'';//将字符串表示的大整形数转成i整形数组表示的大整形数
for(int i=Lb-;i>=;i--) nb[Lb-i]=b[i]-'';
for(int i=;i<=La;i++)
for(int j=;j<=Lb;j++)
nc[i+j-]+=na[i]*nb[j];//a的第i位乘以b的第j位为积的第i+j-1位(先不考虑进位)
for(int i=;i<=La+Lb;i++)
nc[i+]+=nc[i]/,nc[i]%=;//统一处理进位
if(nc[La+Lb]) s+=nc[La+Lb]+'';//判断第i+j位上的数字是不是0
for(int i=La+Lb-;i>=;i--)
s+=nc[i]+'';//将整形数组转成字符串
return s;
}
int main()
{
string a,b;
while(cin>>a>>b) cout<<mul(a,b)<<endl;
return ;
}
4、高精除/模
复杂度:O(n*n)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int L=;
int sub(int *a,int *b,int La,int Lb)
{
if(La<Lb) return -;//如果a小于b,则返回-1
if(La==Lb)
{
for(int i=La-;i>=;i--)
if(a[i]>b[i]) break;
else if(a[i]<b[i]) return -;//如果a小于b,则返回-1 }
for(int i=;i<La;i++)//高精度减法
{
a[i]-=b[i];
if(a[i]<) a[i]+=,a[i+]--;
}
for(int i=La-;i>=;i--)
if(a[i]) return i+;//返回差的位数
return ;//返回差的位数 }
string div(string n1,string n2,int nn)//n1,n2是字符串表示的被除数,除数,nn是选择返回商还是余数
{
string s,v;//s存商,v存余数
int a[L],b[L],r[L],La=n1.size(),Lb=n2.size(),i,tp=La;//a,b是整形数组表示被除数,除数,tp保存被除数的长度
fill(a,a+L,);fill(b,b+L,);fill(r,r+L,);//数组元素都置为0
for(i=La-;i>=;i--) a[La--i]=n1[i]-'';
for(i=Lb-;i>=;i--) b[Lb--i]=n2[i]-'';
if(La<Lb || (La==Lb && n1<n2)) {
//cout<<0<<endl;
return n1;}//如果a<b,则商为0,余数为被除数
int t=La-Lb;//除被数和除数的位数之差
for(int i=La-;i>=;i--)//将除数扩大10^t倍
if(i>=t) b[i]=b[i-t];
else b[i]=;
Lb=La;
for(int j=;j<=t;j++)
{
int temp;
while((temp=sub(a,b+j,La,Lb-j))>=)//如果被除数比除数大继续减
{
La=temp;
r[t-j]++;
}
}
for(i=;i<L-;i++) r[i+]+=r[i]/,r[i]%=;//统一处理进位
while(!r[i]) i--;//将整形数组表示的商转化成字符串表示的
while(i>=) s+=r[i--]+'';
//cout<<s<<endl;
i=tp;
while(!a[i]) i--;//将整形数组表示的余数转化成字符串表示的</span>
while(i>=) v+=a[i--]+'';
if(v.empty()) v="";
//cout<<v<<endl;
if(nn==) return s;
if(nn==) return v;
}
int main()
{
string a,b;
while(cin>>a>>b) cout<<div(a,b,)<<endl;
return ;
}
5、高精阶乘
复杂度:O(n*n)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int L=;
int a[L];
string fac(int n)
{
string ans;
if(n==) return "";
fill(a,a+L,);
int s=,m=n;
while(m) a[++s]=m%,m/=;
for(int i=n-;i>=;i--)
{
int w=;
for(int j=;j<=s;j++) a[j]=a[j]*i+w,w=a[j]/,a[j]=a[j]%;
while(w) a[++s]=w%,w/=;
}
while(!a[s]) s--;
while(s>=) ans+=a[s--]+'';
return ans;
}
int main()
{
int n;
while(cin>>n) cout<<fac(n)<<endl;
return ;
}
6、高精度幂
复杂度:O(nlognlogm)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>
#include <set>
#include <vector>
using namespace std;
#define L(x) (1 << (x))
const double PI = acos(-1.0);
const int Maxn = ;
double ax[Maxn], ay[Maxn], bx[Maxn], by[Maxn];
char sa[Maxn/],sb[Maxn/];
int sum[Maxn];
int x1[Maxn],x2[Maxn];
int revv(int x, int bits)
{
int ret = ;
for (int i = ; i < bits; i++)
{
ret <<= ;
ret |= x & ;
x >>= ;
}
return ret;
}
void fft(double * a, double * b, int n, bool rev)
{
int bits = ;
while ( << bits < n) ++bits;
for (int i = ; i < n; i++)
{
int j = revv(i, bits);
if (i < j)
swap(a[i], a[j]), swap(b[i], b[j]);
}
for (int len = ; len <= n; len <<= )
{
int half = len >> ;
double wmx = cos( * PI / len), wmy = sin( * PI / len);
if (rev) wmy = -wmy;
for (int i = ; i < n; i += len)
{
double wx = , wy = ;
for (int j = ; j < half; j++)
{
double cx = a[i + j], cy = b[i + j];
double dx = a[i + j + half], dy = b[i + j + half];
double ex = dx * wx - dy * wy, ey = dx * wy + dy * wx;
a[i + j] = cx + ex, b[i + j] = cy + ey;
a[i + j + half] = cx - ex, b[i + j + half] = cy - ey;
double wnx = wx * wmx - wy * wmy, wny = wx * wmy + wy * wmx;
wx = wnx, wy = wny;
}
}
}
if (rev)
{
for (int i = ; i < n; i++)
a[i] /= n, b[i] /= n;
}
}
int solve(int a[],int na,int b[],int nb,int ans[])
{
int len = max(na, nb), ln;
for(ln=; L(ln)<len; ++ln);
len=L(++ln);
for (int i = ; i < len ; ++i)
{
if (i >= na) ax[i] = , ay[i] =;
else ax[i] = a[i], ay[i] = ;
}
fft(ax, ay, len, );
for (int i = ; i < len; ++i)
{
if (i >= nb) bx[i] = , by[i] = ;
else bx[i] = b[i], by[i] = ;
}
fft(bx, by, len, );
for (int i = ; i < len; ++i)
{
double cx = ax[i] * bx[i] - ay[i] * by[i];
double cy = ax[i] * by[i] + ay[i] * bx[i];
ax[i] = cx, ay[i] = cy;
}
fft(ax, ay, len, );
for (int i = ; i < len; ++i)
ans[i] = (int)(ax[i] + 0.5);
return len;
}
string mul(string sa,string sb)
{
int l1,l2,l;
int i;
string ans;
memset(sum, , sizeof(sum));
l1 = sa.size();
l2 = sb.size();
for(i = ; i < l1; i++)
x1[i] = sa[l1 - i - ]-'';
for(i = ; i < l2; i++)
x2[i] = sb[l2-i-]-'';
l = solve(x1, l1, x2, l2, sum);
for(i = ; i<l || sum[i] >= ; i++) // 进位
{
sum[i + ] += sum[i] / ;
sum[i] %= ;
}
l = i;
while(sum[l] <= && l>) l--; // 检索最高位
for(i = l; i >= ; i--) ans+=sum[i] + ''; // 倒序输出
return ans;
}
string Pow(string a,int n)
{
if(n==) return a;
if(n&) return mul(Pow(a,n-),a);
string ans=Pow(a,n/);
return mul(ans,ans);
}
int main()
{
cin.sync_with_stdio(false);
string a;
int b;
while(cin>>a>>b) cout<<Pow(a,b)<<endl;
return ;
}
7、高精GCD
复杂度:无法估计
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int L=;
string add(string a,string b)
{
string ans;
int na[L]={},nb[L]={};
int la=a.size(),lb=b.size();
for(int i=;i<la;i++) na[la--i]=a[i]-'';
for(int i=;i<lb;i++) nb[lb--i]=b[i]-'';
int lmax=la>lb?la:lb;
for(int i=;i<lmax;i++) na[i]+=nb[i],na[i+]+=na[i]/,na[i]%=;
if(na[lmax]) lmax++;
for(int i=lmax-;i>=;i--) ans+=na[i]+'';
return ans;
}
string mul(string a,string b)
{
string s;
int na[L],nb[L],nc[L],La=a.size(),Lb=b.size();//na存储被乘数,nb存储乘数,nc存储积
fill(na,na+L,);fill(nb,nb+L,);fill(nc,nc+L,);//将na,nb,nc都置为0
for(int i=La-;i>=;i--) na[La-i]=a[i]-'';//将字符串表示的大整形数转成i整形数组表示的大整形数
for(int i=Lb-;i>=;i--) nb[Lb-i]=b[i]-'';
for(int i=;i<=La;i++)
for(int j=;j<=Lb;j++)
nc[i+j-]+=na[i]*nb[j];//a的第i位乘以b的第j位为积的第i+j-1位(先不考虑进位)
for(int i=;i<=La+Lb;i++)
nc[i+]+=nc[i]/,nc[i]%=;//统一处理进位
if(nc[La+Lb]) s+=nc[La+Lb]+'';//判断第i+j位上的数字是不是0
for(int i=La+Lb-;i>=;i--)
s+=nc[i]+'';//将整形数组转成字符串
return s;
}
int sub(int *a,int *b,int La,int Lb)
{
if(La<Lb) return -;//如果a小于b,则返回-1
if(La==Lb)
{
for(int i=La-;i>=;i--)
if(a[i]>b[i]) break;
else if(a[i]<b[i]) return -;//如果a小于b,则返回-1 }
for(int i=;i<La;i++)//高精度减法
{
a[i]-=b[i];
if(a[i]<) a[i]+=,a[i+]--;
}
for(int i=La-;i>=;i--)
if(a[i]) return i+;//返回差的位数
return ;//返回差的位数 }
string div(string n1,string n2,int nn)//n1,n2是字符串表示的被除数,除数,nn是选择返回商还是余数
{
string s,v;//s存商,v存余数
int a[L],b[L],r[L],La=n1.size(),Lb=n2.size(),i,tp=La;//a,b是整形数组表示被除数,除数,tp保存被除数的长度
fill(a,a+L,);fill(b,b+L,);fill(r,r+L,);//数组元素都置为0
for(i=La-;i>=;i--) a[La--i]=n1[i]-'';
for(i=Lb-;i>=;i--) b[Lb--i]=n2[i]-'';
if(La<Lb || (La==Lb && n1<n2)) {
//cout<<0<<endl;
return n1;}//如果a<b,则商为0,余数为被除数
int t=La-Lb;//除被数和除数的位数之差
for(int i=La-;i>=;i--)//将除数扩大10^t倍
if(i>=t) b[i]=b[i-t];
else b[i]=;
Lb=La;
for(int j=;j<=t;j++)
{
int temp;
while((temp=sub(a,b+j,La,Lb-j))>=)//如果被除数比除数大继续减
{
La=temp;
r[t-j]++;
}
}
for(i=;i<L-;i++) r[i+]+=r[i]/,r[i]%=;//统一处理进位
while(!r[i]) i--;//将整形数组表示的商转化成字符串表示的
while(i>=) s+=r[i--]+'';
//cout<<s<<endl;
i=tp;
while(!a[i]) i--;//将整形数组表示的余数转化成字符串表示的</span>
while(i>=) v+=a[i--]+'';
if(v.empty()) v="";
//cout<<v<<endl;
if(nn==) return s;
if(nn==) return v;
}
bool judge(string s)//判断s是否为全0串
{
for(int i=;i<s.size();i++)
if(s[i]!='') return false;
return true;
}
string gcd(string a,string b)//求最大公约数
{
string t;
while(!judge(b))//如果余数不为0,继续除
{
t=a;//保存被除数的值
a=b;//用除数替换被除数
b=div(t,b,);//用余数替换除数
}
return a;
}
int main()
{
cin.sync_with_stdio(false);
string a,b;
while(cin>>a>>b) cout<<gcd(a,b)<<endl;
return ;
}
8、高精进制转换
复杂度:O(n*n)
#include<iostream>
#include<algorithm>
using namespace std;
//将字符串表示的10进制大整数转换为m进制的大整数
//并返回m进制大整数的字符串
bool judge(string s)//判断串是否为全零串
{
for(int i=;i<s.size();i++)
if(s[i]!='') return ;
return ;
}
string solve(string s,int n,int m)//n进制转m进制只限0-9进制,若涉及带字母的进制,稍作修改即可
{
string r,ans;
int d=;
if(!judge(s)) return "";//特判
while(judge(s))//被除数不为0则继续
{
for(int i=;i<s.size();i++)
{
r+=(d*n+s[i]-'')/m+'';//求出商
d=(d*n+(s[i]-''))%m;//求出余数
}
s=r;//把商赋给下一次的被除数
r="";//把商清空
ans+=d+'';//加上进制转换后数字
d=;//清空余数
}
reverse(ans.begin(),ans.end());//倒置下
return ans;
}
int main()
{
string s;
while(cin>>s)
{
cout<<solve(s,,)<<endl;
}
return ;
}
9、高精平方根
复杂度:O(n*n*n)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int L=;
string add(string a,string b)//只限两个非负整数相加
{
string ans;
int na[L]={},nb[L]={};
int la=a.size(),lb=b.size();
for(int i=;i<la;i++) na[la--i]=a[i]-'';
for(int i=;i<lb;i++) nb[lb--i]=b[i]-'';
int lmax=la>lb?la:lb;
for(int i=;i<lmax;i++) na[i]+=nb[i],na[i+]+=na[i]/,na[i]%=;
if(na[lmax]) lmax++;
for(int i=lmax-;i>=;i--) ans+=na[i]+'';
return ans;
}
string sub(string a,string b)//只限大的非负整数减小的非负整数
{
string ans;
int na[L]={},nb[L]={};
int la=a.size(),lb=b.size();
for(int i=;i<la;i++) na[la--i]=a[i]-'';
for(int i=;i<lb;i++) nb[lb--i]=b[i]-'';
int lmax=la>lb?la:lb;
for(int i=;i<lmax;i++)
{
na[i]-=nb[i];
if(na[i]<) na[i]+=,na[i+]--;
}
while(!na[--lmax]&&lmax>) ;lmax++;
for(int i=lmax-;i>=;i--) ans+=na[i]+'';
return ans;
}
string mul(string a,string b)//高精度乘法a,b,均为非负整数
{
string s;
int na[L],nb[L],nc[L],La=a.size(),Lb=b.size();//na存储被乘数,nb存储乘数,nc存储积
fill(na,na+L,);fill(nb,nb+L,);fill(nc,nc+L,);//将na,nb,nc都置为0
for(int i=La-;i>=;i--) na[La-i]=a[i]-'';//将字符串表示的大整形数转成i整形数组表示的大整形数
for(int i=Lb-;i>=;i--) nb[Lb-i]=b[i]-'';
for(int i=;i<=La;i++)
for(int j=;j<=Lb;j++)
nc[i+j-]+=na[i]*nb[j];//a的第i位乘以b的第j位为积的第i+j-1位(先不考虑进位)
for(int i=;i<=La+Lb;i++)
nc[i+]+=nc[i]/,nc[i]%=;//统一处理进位
if(nc[La+Lb]) s+=nc[La+Lb]+'';//判断第i+j位上的数字是不是0
for(int i=La+Lb-;i>=;i--)
s+=nc[i]+'';//将整形数组转成字符串
return s;
}
int sub(int *a,int *b,int La,int Lb)
{
if(La<Lb) return -;//如果a小于b,则返回-1
if(La==Lb)
{
for(int i=La-;i>=;i--)
if(a[i]>b[i]) break;
else if(a[i]<b[i]) return -;//如果a小于b,则返回-1 }
for(int i=;i<La;i++)//高精度减法
{
a[i]-=b[i];
if(a[i]<) a[i]+=,a[i+]--;
}
for(int i=La-;i>=;i--)
if(a[i]) return i+;//返回差的位数
return ;//返回差的位数 }
string div(string n1,string n2,int nn)//n1,n2是字符串表示的被除数,除数,nn是选择返回商还是余数
{
string s,v;//s存商,v存余数
int a[L],b[L],r[L],La=n1.size(),Lb=n2.size(),i,tp=La;//a,b是整形数组表示被除数,除数,tp保存被除数的长度
fill(a,a+L,);fill(b,b+L,);fill(r,r+L,);//数组元素都置为0
for(i=La-;i>=;i--) a[La--i]=n1[i]-'';
for(i=Lb-;i>=;i--) b[Lb--i]=n2[i]-'';
if(La<Lb || (La==Lb && n1<n2)) {
//cout<<0<<endl;
return n1;}//如果a<b,则商为0,余数为被除数
int t=La-Lb;//除被数和除数的位数之差
for(int i=La-;i>=;i--)//将除数扩大10^t倍
if(i>=t) b[i]=b[i-t];
else b[i]=;
Lb=La;
for(int j=;j<=t;j++)
{
int temp;
while((temp=sub(a,b+j,La,Lb-j))>=)//如果被除数比除数大继续减
{
La=temp;
r[t-j]++;
}
}
for(i=;i<L-;i++) r[i+]+=r[i]/,r[i]%=;//统一处理进位
while(!r[i]) i--;//将整形数组表示的商转化成字符串表示的
while(i>=) s+=r[i--]+'';
//cout<<s<<endl;
i=tp;
while(!a[i]) i--;//将整形数组表示的余数转化成字符串表示的</span>
while(i>=) v+=a[i--]+'';
if(v.empty()) v="";
//cout<<v<<endl;
if(nn==) return s;
if(nn==) return v;
}
bool cmp(string a,string b)
{
if(a.size()<b.size()) return ;//a小于等于b返回真
if(a.size()==b.size()&&a<=b) return ;
return ;
}
string BigInterSqrt(string n)
{
string l="",r=n,mid,ans;
while(cmp(l,r))
{
mid=div(add(l,r),"",);
if(cmp(mul(mid,mid),n)) ans=mid,l=add(mid,"");
else r=sub(mid,"");
}
return ans;
}
string DeletePreZero(string s)
{
int i;
for(i=;i<s.size();i++)
if(s[i]!='') break;
return s.substr(i);
}
int main()
{
//freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
string n;
int t;
cin>>t;
while(t--)
{
cin>>n;
n=DeletePreZero(n);
cout<<BigInterSqrt(n)<<endl;
//cout<<BigInterSqrt(n).size()<<endl;
}
return ;
}
10、FFT优化高精乘
复杂度:O(nlogn)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>
#include <set>
#include <vector>
using namespace std;
#define L(x) (1 << (x))
const double PI = acos(-1.0);
const int Maxn = ;
double ax[Maxn], ay[Maxn], bx[Maxn], by[Maxn];
char sa[Maxn/],sb[Maxn/];
int sum[Maxn];
int x1[Maxn],x2[Maxn];
int revv(int x, int bits)
{
int ret = ;
for (int i = ; i < bits; i++)
{
ret <<= ;
ret |= x & ;
x >>= ;
}
return ret;
}
void fft(double * a, double * b, int n, bool rev)
{
int bits = ;
while ( << bits < n) ++bits;
for (int i = ; i < n; i++)
{
int j = revv(i, bits);
if (i < j)
swap(a[i], a[j]), swap(b[i], b[j]);
}
for (int len = ; len <= n; len <<= )
{
int half = len >> ;
double wmx = cos( * PI / len), wmy = sin( * PI / len);
if (rev) wmy = -wmy;
for (int i = ; i < n; i += len)
{
double wx = , wy = ;
for (int j = ; j < half; j++)
{
double cx = a[i + j], cy = b[i + j];
double dx = a[i + j + half], dy = b[i + j + half];
double ex = dx * wx - dy * wy, ey = dx * wy + dy * wx;
a[i + j] = cx + ex, b[i + j] = cy + ey;
a[i + j + half] = cx - ex, b[i + j + half] = cy - ey;
double wnx = wx * wmx - wy * wmy, wny = wx * wmy + wy * wmx;
wx = wnx, wy = wny;
}
}
}
if (rev)
{
for (int i = ; i < n; i++)
a[i] /= n, b[i] /= n;
}
}
int solve(int a[],int na,int b[],int nb,int ans[])
{
int len = max(na, nb), ln;
for(ln=; L(ln)<len; ++ln);
len=L(++ln);
for (int i = ; i < len ; ++i)
{
if (i >= na) ax[i] = , ay[i] =;
else ax[i] = a[i], ay[i] = ;
}
fft(ax, ay, len, );
for (int i = ; i < len; ++i)
{
if (i >= nb) bx[i] = , by[i] = ;
else bx[i] = b[i], by[i] = ;
}
fft(bx, by, len, );
for (int i = ; i < len; ++i)
{
double cx = ax[i] * bx[i] - ay[i] * by[i];
double cy = ax[i] * by[i] + ay[i] * bx[i];
ax[i] = cx, ay[i] = cy;
}
fft(ax, ay, len, );
for (int i = ; i < len; ++i)
ans[i] = (int)(ax[i] + 0.5);
return len;
}
string mul(string sa,string sb)
{
int l1,l2,l;
int i;
string ans;
memset(sum, , sizeof(sum));
l1 = sa.size();
l2 = sb.size();
for(i = ; i < l1; i++)
x1[i] = sa[l1 - i - ]-'';
for(i = ; i < l2; i++)
x2[i] = sb[l2-i-]-'';
l = solve(x1, l1, x2, l2, sum);
for(i = ; i<l || sum[i] >= ; i++) // 进位
{
sum[i + ] += sum[i] / ;
sum[i] %= ;
}
l = i;
while(sum[l] <= && l>) l--; // 检索最高位
for(i = l; i >= ; i--) ans+=sum[i] + ''; // 倒序输出
return ans;
}
int main()
{
cin.sync_with_stdio(false);
string a,b;
while(cin>>a>>b) cout<<mul(a,b)<<endl;
return ;
}
【高精度】模板 (C++)的更多相关文章
- [Template]高精度模板
重新写一下高精度模板(不要问我为什么) 自认为代码风格比较漂亮(雾 如果有更好的写法欢迎赐教 封装结构体big B是压位用的进制,W是每位长度 size表示长度,d[]就是保存的数字,倒着保存,从1开 ...
- C++高精度模板
原文地址:http://blog.csdn.net/wall_f/article/details/8373395 原文只附代码,没有解析,本文增加了一些对代码的解释. 请注意:本模板不涉及实数运算与负 ...
- [note]高精度模板
高精度模板 先定义一个struct struct gj{ int l,s[N]; bool fh; void Print(){ if(fh)putchar('-'); for(int i=l;i> ...
- 高精度模板 支持各种运算 c++
绪言 自从有了高精度模板,妈妈再也不用怕我不会打高精度了! 代码 代码长度与日俱增啊~~~ #include<iostream> #include<cstring> #incl ...
- 高精度模板 Luogu P1932 A+B & A-B & A*B & A/B Problem
P1932 A+B & A-B & A*B & A/B Problem 题目背景 这个题目很新颖吧!!! 题目描述 求A.B的和差积商余! 输入输出格式 输入格式: 两个数两行 ...
- Java 大数、高精度模板
介绍: java中用于操作大数的类主要有两个,一个是BigInteger,代表大整数类用于对大整数进行操作,另一个是BigDecimal,代表高精度类,用于对比较大或精度比较高的浮点型数据进行操作.因 ...
- JAVA高精度模板
刚开始还坚持用C++写高精来着,后来发现JAVA写高精方便太多了,所以也来学习一下JAVA高精度的模板. 参考:https://www.cnblogs.com/imzscilovecode/p/883 ...
- 高精度模板 洛谷Luogu P1932 A+B & A-B & A*B & A/B Problem
P1932 A+B & A-B & A*B & A/B Problem 题目背景 这个题目很新颖吧!!! 题目描述 求A.B的和差积商余! 输入输出格式 输入格式: 两个数两行 ...
- [SinGuLaRiTy] 复习模板-高精度模板
[SinGuLaRiTy-1042] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 结构体封装 //高精度运算 注意%I64d与%lld # ...
- XDOJ 1046 - 高精度模板综合测试 - [高精度模板]
题目链接:http://acm.xidian.edu.cn/problem.php?id=1046 题目描述 请输出两个数的和,差,积,商,取余.注意不要有前导零. 输入 多组数据,每组数据是两个整数 ...
随机推荐
- P1681 最大正方形 Iand II
题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...
- ubuntu配置硬盘开机自动挂载
1.创建/media/fly文件夹 sudo mkdir /home/fly #根据个人喜好命名 2.获取要自动挂载的分区的UUID和分区类型TYPE sudo blkid 出现如下结果: ...
- 构建第一个Spring Boot2.0应用之集成mybatis、Druid(七)
一.环境: IDE:IntelliJ IDEA 2017.1.1 JDK:1.8.0_161 Maven:3.3.9 springboot:2.0.2.RELEASE 二.说明: 本文综合之 ...
- LAMP Stack 5.7.16 (Ubuntu 16.04.1)
平台: Ubuntu 类型: 虚拟机镜像 软件包: apache2.4 mysql5.7 php7 phpmyadmin4.5 apache application server basic soft ...
- Python Visual Studio 2015
对于一直是C#开发的我来说,上Python是老早就想的事情了. 上次有个项目开始做就说要用Python,后来因为不太熟练就给推掉了.现在终于还是有机会开始下Python之旅. 因为是在Visual S ...
- webpack前端构建工具学习总结(二)之loader的使用
Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换. Loader 可以理解为是模块和资源的转换器,它本身是一个函数,接受源文件作为 ...
- LeetCode Length of Last Word 最后一个字的长度
class Solution { public: int lengthOfLastWord(const char *s) { ; string snew=s; ,len=strlen(s); ]; ) ...
- JS每点击一次添加多少条数据
很久不写文档,平时只写日记,所以对这个有点生疏,如果写的不好别介意. 今天闲的蛋疼,于是要写写白天的东西,并且以后也会一直更新(一直写)下去. 时间太仓促了,这几个月,今天算最晚的一次凌晨1点,吃不消 ...
- 测试发布(maven-assembly-plugin看好你哦)
项目改成了maven管理,现场需要用增量补丁包的形式发布代码: 2015/4/21 以前试过用ant打补丁包,现在试试maven能不能做同样的事情: maven-assembly-plugin看着可以 ...
- spark dataframe函数编程
DataFrame 的函数 Action 操作 1. collect() ,返回值是一个数组,返回dataframe集合所有的行 2. collectAsList() 返回值是一个Java类型的数组, ...