您的位置:首页 > 其它

【高精度运算】

2011-08-18 21:23 267 查看
虽说高精度直接考查的越来越少,不过还是以防万一。

#define maxlen 1000
struct bint{
int len,s[maxlen];
bint(){len=1;memset(s,0,sizeof(s));}
//*******本模板既可输入字符串,也可输入整数*******//
bint(int t){
memset(s,0,sizeof(s));len=1;
while(t){s[len++]=t%10;t/=10;}
if(len>1)len--;
}
bint(char *str){
memset(s,0,sizeof(s));len=strlen(str);
for(int i=1;i<=len;i++)s[i]=str[len-i]-'0';
}
//print number
friend void print(bint bi){
for(int i=bi.len;i>=1;i--)printf("%d",bi.s[i]);
}
//print number+enter
friend void println(bint bi){
print(bi);printf("\n");
}
//可作连=运算
bint operator=(int t){
len=1;if(t==0){s[1] = 0;return *this;}
while(t){s[len++]=t%10;t/=10;}
len--;
return *this;
}
bint operator=(char *str){
len=strlen(str);
for(int i=1;i<=len;i++)s[i]=str[len-i]-'0';
return *this;
}
friend int cmp(const bint &a,const bint &b){
//a>b返回正数,a==b返回0,a<b返回负数
if(a.len!=b.len)return a.len-b.len;
for(int i=a.len;i>0;i--)
if(a.s[i]!=b.s[i])return a.s[i]-b.s[i];
return 0;
}
//*******加法*******//
bint operator+(const bint &bi){
int i; bint c;
for(i=1;i<=len || i<=bi.len || c.s[i];i++){
c.s[i]+=s[i]+bi.s[i];
c.s[i+1]=c.s[i]/10;c.s[i]%=10;
}
if(i>1)c.len=i-1;
return c;
}
//*******减法*******//
bint operator-(const bint &bi){//只考虑a>=b,不考虑负数
int i,j; bint c;
for(i=1,j=0;i<=len;i++){
c.s[i]=s[i]-j;if(i<=bi.len)c.s[i]-=bi.s[i];
if(c.s[i]<0){j=1;c.s[i]+=10;}else j=0;
}
c.len=len;while(c.len>1 && !c.s[c.len])c.len--;
return c;
}
//*******乘法*******//
bint operator*(const bint &bi){
int i,j;bint c;c.len=len+bi.len;
for(i=1;i<=len;i++)
for(j=1;j<=bi.len;j++)c.s[i+j-1]+=s[i]*bi.s[j];
for(i=1;i<c.len || c.s[i];i++){
c.s[i+1]+=c.s[i]/10;c.s[i]%=10;
}
while(i>1 && !c.s[i])i--;c.len=i;
return c;
}
//*******除法*******//
bint operator/(const bint &bi){
int i,j;bint d,c;
for(i=len;i>0;i--){
if(!(d.len==1 && d.s[1]==0)){
for(j=d.len;j>0;j--)d.s[j+1]=d.s[j];
++d.len;
}
d.s[1]=s[i];
while((j=cmp(d,bi))>=0){
d=d-bi;c.s[i]++;
if(j==0)break;
}
}
c.len=len;
while(c.len>1 && c.s[c.len]==0)c.len--;
return c;
}
//*******取余*******//
bint operator%(const bint &bi){
int i,j;bint d;
for(i=len;i>0;i--){
if(!(d.len==1 && d.s[1]==0)){
for(j=d.len;j>0;j--)d.s[j+1]=d.s[j];
++d.len;
}

d.s[1]=s[i];
while((j=cmp(d,bi))>=0){d=d-bi;if(j==0)break;}
}
return d;
}
//*******次方*******//
bint pow(int exp){
bint ret = 1, t = (*this);
while (exp){
if (exp & 1)
ret = ret * t;
exp >>= 1; t = t * t;
}
return ret;
}
};
bint a,b;
int main()
{
char s1[100],s2[100];
scanf("%s%s",s1,s2);
a=bint(s1),b=bint(s2);
println(a+b);
println(a-b);//a>=b
println(a*b);
println(a/b);
println(a.pow(3));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: