跳到主要内容

高精度运算

· 阅读需 2 分钟
struct High_accuracy
{
int num[310];
int siz;

//初始化
High_accuracy()
{
for( int i=0;i<310;i++ ) num[i]=0;
siz=0;
}

//直接读入高精
void read()
{
string s;
cin>>s;
siz=s.size();
for( int i=1;i<=siz;i++ ) num[i]=( s[siz-i]-'0' );
}

//整型读入转化为高精
void read( int x )
{
int dre=0;
while( x )
{
num[++dre]=x%10;
x/=10;
}
siz=dre;
}

//输出高精
void print()
{
//前导0已经在各运算中省略
for( int i=siz;i>=1;i-- ) cout<<num[i];
cout<<"\n";
}

//高精加高精
High_accuracy operator +( High_accuracy b )
{
High_accuracy ans;
ans.siz=max( siz,b.siz );
for( int i=1;i<=ans.siz;i++ )
{
ans.num[i]+=num[i]+b.num[i];
if( ans.num[i] >= 10 ){ ans.num[i+1]+=1, ans.num[i]%=10; }
}
if( ans.num[ans.siz+1] ) ans.siz++;
return ans;
}

//高精减高精
High_accuracy operator -( High_accuracy b )
{
High_accuracy ans;
ans.siz=1;//保证可以输出0
for( int i=1;i<=siz;i++ )
{
int del=num[i]-b.num[i];
if( del < 0 ){ num[i+1]-=1, del+=10; }
ans.num[i]=del;
if( del ){ ans.siz=i; }
}
return ans;
}

//高精乘高精(乘低精就转化为高精)
High_accuracy operator *( High_accuracy b )
{
High_accuracy ans;
for( int i=1;i<=siz;i++ )
{
for( int j=1;j<=b.siz;j++ )
{
int add=num[i]*b.num[j];
ans.num[i+j-1]+=add;
if( ans.num[i+j-1] >= 10 )
{
ans.num[i+j]+=ans.num[i+j-1]/10;
ans.num[i+j-1]%=10;
ans.siz=max( ans.siz,i+j );
}
ans.siz=max( ans.siz,i+j-1 );
}
}
return ans;
}

//高精除低精(竖式模拟)
High_accuracy operator /( int b )
{
High_accuracy ans;
ans.siz=siz;
int res=0;
for( int i=siz;i>=1;i-- )
{
res=res*10+num[i];
ans.num[i]=res/b;
res%=b;
}
while( ans.num[ans.siz] == 0 && ans.siz > 1 ) ans.siz--;
return ans;
}

//高精除低精取余数(竖式模拟)
int operator %( int b )
{
int res=0;
for( int i=siz;i>=1;i-- )
{
res=res*10+num[i];
res%=b;
}
return res;
}
};