高精度模板第一次修订版
发布时间:2020-12-14 04:06:09 所属栏目:大数据 来源:网络整理
导读:把之前自己用的大数板子升级了一下: 更新记录: 1 增加了读入函数,修正输出时的bug。 2 增加了更多的大小关系判断,可以直接用 sort 函数排序了。 3 从以前用 long long 存储7位变成用 int 存储4位,对各oj泛用性更好 4 增加了对int数取模 5 去掉了从 64位
|
把之前自己用的大数板子升级了一下: 更新记录: 1 增加了读入函数,修正输出时的bug。 2 增加了更多的大小关系判断,可以直接用 sort 函数排序了。 3 从以前用 long long 存储7位变成用 int 存储4位,对各oj泛用性更好 4 增加了对int数取模 5 去掉了从 64位整数读入 6 代码风格和细节优化 以下摘录几个别人的模板,备用。 hdu 4002 收获非常大的一个题 多功能大数模板的应用 一个非常好用的大数类模板BigNum. HDU 1134 大数取模 使用大数模板 #include <cmath>
#include <stack>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MOD=10000; //数组每个元素保存4位数字
const int maxlen=1000+20; //数字最长位数
class BigNum
{
private:
int a[maxlen/4+5];
public:
BigNum operator + (BigNum temp) //大数+大数
{
BigNum ans;
int i,j,k,p;
if (a[0]>temp.a[0]) p=a[0];
else p=temp.a[0];
for (i=a[0],j=temp.a[0],k=p; j>=1&&i>=1; i--,j--,k--)
ans.a[k]=a[i]+temp.a[j];
if (j==0)
while(i>=1) ans.a[i]=a[i--];
else
while(j>=1) ans.a[j]=temp.a[j--];
ans.a[0]=0;
for (i=p;i>=1;i--)
{
ans.a[i-1]+=ans.a[i]/MOD;
ans.a[i]%=MOD;
}
if (ans.a[0])
{
for (i=p+1;i>=1;i--)
ans.a[i]=ans.a[i-1];
ans.a[0]=p+1;
}
else ans.a[0]=p;
return ans;
}
BigNum operator-(BigNum temp) //大数-大数
{
BigNum ans;
int i,j;
for (i=0;i<=a[0];i++) ans.a[i]=a[i];
for (i=ans.a[0],j=temp.a[0];i>=1&&j>=1;i--,j--)
ans.a[i]-=temp.a[j];
for (i=ans.a[0];i>=1;i--) if(ans.a[i]<0)
{
ans.a[i]+=MOD;
ans.a[i-1]--;
}
for (i=1;i<=a[0];i++) if(ans.a[i]) break;
if (i>a[0])
{
ans.a[0]=1;
ans.a[1]=0;
return ans;
}
for (j=i;j<=a[0];j++) ans.a[j+1-i]=ans.a[j];
ans.a[0]=a[0]-i+1;
return ans;
}
BigNum operator*(BigNum temp) //大数乘大数
{
BigNum ans;
int i,p=a[0]+temp.a[0]-1;
memset(ans.a,sizeof(ans.a));
for (i=a[0];i>=1;i--) for (j=temp.a[0];j>=1;j--)
ans.a[i+j-1]+=a[i]*temp.a[j];
ans.a[0]=0;
for (i=p;i>=1;i--)
{
ans.a[i-1]+=ans.a[i]/MOD;
ans.a[i]%=MOD;
}
if (ans.a[0])
{
for (i=p;i>=0;i--) ans.a[i+1]=ans.a[i];
ans.a[0]=p+1;
}
else ans.a[0]=p;
return ans;
}
BigNum operator*(int temp) //大数乘以小数
{
BigNum ans;
int i;
for (i=1;i<=a[0];i++) ans.a[i]=a[i]*temp;
ans.a[0]=0;
for (i=a[0];i>=1;i--)
{
ans.a[i-1]+=ans.a[i]/MOD;
ans.a[i]%=MOD;
}
if (ans.a[0])
{
for (i=a[0];i>=0;i--) ans.a[i+1]=ans.a[i];
ans.a[0]=a[0]+1;
}
else ans.a[0]=a[0];
if (ans.a[1]>=MOD)
{
for (i=ans.a[0];i>=0;i--) ans.a[i+1]=ans.a[i];
ans.a[0]++;
}
return ans;
}
BigNum operator/(int x) //大数除以小数
{
BigNum ans;
int i,p;
for (i=1;i<=a[0];i++)
if (i==1)
{
ans.a[i]=a[i]/x;
p=a[i]%x;
}
else
{
ans.a[i]=(p*MOD+a[i])/x;
p=(p*MOD+a[i])%x;
}
for (i=1;i<=a[0];i++) if(ans.a[i]) break;
if (i>a[0])
{
ans.a[0]=1;
ans.a[1]=0;
return ans;
}
for (j=i;j<=a[0];j++) ans.a[j+1-i]=ans.a[j];
ans.a[0]=a[0]-i+1;
return ans;
}
BigNum operator/(BigNum temp) //大数除以大数
{
BigNum ans,t;
BigNum low=BigNum(1),high,mid;
for (int i=1;i<=a[0];i++) t.a[i]=high.a[i]=a[i];
t.a[0]=high.a[0]=a[0];
while (!(low>high))
{
mid=(low+high)/2;
if (mid*temp>t) high=mid-BigNum(1);
else low=mid+BigNum(1);
}
if (!(low>t)&&!(temp*low>t)) return low;
return high;
}
BigNum operator%(BigNum temp) //大数模大数
{
BigNum t;
for (int i=1;i<=a[0];i++) t.a[i]=a[i];
t.a[0]=a[0];
return t-t/temp*temp;
}
int operator%(int temp) //大数模小数
{
int i,d=0;
for (i=1;i<=a[0];i++)
d=((d*MOD)%temp+a[i])%temp;
return d;
}
bool operator==(BigNum temp) //大数与大数相等
{
if (a[0]!=temp.a[0]) return false;
for (int i=1;i<=a[0];i++) if(a[i]!=temp.a[i]) return false;
return true;
}
bool operator!=(BigNum temp) //不等于
{
return !(*this==temp);
}
bool operator>(BigNum temp) //大于比较
{
if (a[0]>temp.a[0]) return true;
if (a[0]<temp.a[0]) return false;
for (int i=1;i<=a[0];i++) if(a[i]!=temp.a[i]) return a[i]>temp.a[i];
return false;
}
bool operator>=(BigNum temp) //大于等于比较
{
return *this>temp || *this==temp;
}
bool operator<=(BigNum temp) //小于等于比较
{
return !(*this>temp);
}
bool operator<(BigNum temp) //小于比较
{
return *this<=temp && *this!=temp;
}
public:
BigNum () { memset(a,sizeof(a));a[0]=1,a[1]=0; }
BigNum (int x)
{
if (x>=MOD) a[0]=2,a[1]=x/MOD,a[2]=x%MOD;
else a[0]=1,a[1]=x;
}
BigNum (string str)
{
int i;
for (i=0;i<str.length();i++) if(str[i]!='0') break;
if (i==str.length())
{
a[0]=1,a[1]=0;
return;
}
str=str.substr(i,str.length()-i);
int p=str.length()%4,k;
a[0]=0;
if (p)
{
a[0]=1,k=0;
for (i=0;i<p;i++) k=k*10+str[i]-'0';
a[1]=k;
str=str.substr(p,str.length()-p);
}
for (i=0;i<str.length();)
{
k=0;
for (j=i;j<i+4;j++) k=k*10+str[j]-'0';
a[++a[0]]=k;
i=j;
}
}
int scan ()
{
string str;
if (cin >>str) { *this=str;return 1; }
return -1;
}
void print ()
{
printf("%d",a[1]);
for (int i=2;i<=a[0];i++) printf("%04d",a[i]);
}
};
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
