文章目录
前言
将高精的+,-,*,/都用结构体封装了一遍
提示:以下是本篇文章正文内容,下面案例可供参考
一、封装高精的+,-,*,/
#include <bits/stdc++.h>
#define maxn 100 //定义数组
using namespace std;
struct Bigint{
//封装结构体
int len,a[maxn];//为了兼顾效率与代码复杂度,用len记录位数,a记录每个数位
Bigint(int x=0){
//通过初始化使得这个大整数能够表示整型x,默认为0
memset(a,0,sizeof(a));
for(len=1;x;len++){
//注意数组是从一开始的
a[len]=x%10;
x/=10;
}
len--;
}
int &operator[](int i){
return a[i];//重载[],可以直接用x[i]代表x.a[i],编写时更自然
}
void flatten(int L){
//‘展开’也可以理解为做进位处理,将超过10的数,进一位,减去10,并且重新设置len的值
len=L;
for(int i=1;i<=len;i++){
a[i+1]+=a[i]/10;
a[i]%=10;
}
while(!a[len]){
len--;
}
}
void jian(int L){
//减法后的‘展开’ 也是将计算后的数做处理,将小于0的数,向高位借一位,加上10,高位减一
len=L;
for(int i=1;i<=len;i++){
if(a[i]<0){
a[i]+=10;
a[i+1]--;
}
}
while(!a[len]){
len--;
}
}
void print(){
//输出
for(int i=max(len,1);i>=1;i--){
printf("%d",a[i]);
}
}
};
Bigint operator+(Bigint a,Bigint b){
//重载+号
Bigint c;
int len=max(a.len,b.len);
for(int i=1;i<=len;i++)
c[i]+=a[i]+b[i];
c.flatten(len+1);
return c;
}
Bigint operator*(Bigint a,int b){
//重载*号 高精乘低精
Bigint c;
int len=a.len;
for(int i=1;i<=len;i++)
c[i]=a[i]*b;
c.flatten(len+11);
return c;
}
Bigint operator-(Bigint a,Bigint b){
//重载-号
Bigint c;
int len=max(a.len,b.len);//从这里开始需要做两个高精数的判断向从长度大小判断,
if(a.len>b.len){
//长度一样,就比对谁的高位大 用大的减小的,如果原本是小数减大数,就需要填一个‘-’号
for(int i=1;i<=len;i++)
c[i]+=a[i]-b[i];
c.jian(len+1);
return c;
}else if(b.len>a.len){
cout<<'-';
for(int i=1;i<=len;i++)
c[i]+=b[i]-a[i];
c.jian(len+1);
return c;
}else{
int flag=1;
for(int i=1;i<=len;i++)
if(a[i]>b[i]){
flag=1;
break;
}else if(a[i]<b[i]){
flag=0;
break;
}
if(flag==1){
for(int i=1;i<=len;i++)
c[i]+=a[i]-b[i];
c.jian(len+1);
return c;
}
if(flag==0){
cout<<'-';
for(int i=1;i<=len;i++)
c[i]+=b[i]-a[i];
c.jian(len+1);
return c;
}
}
}
Bigint operator/(Bigint a,int b){
//重载/号 高精除低精
Bigint c;
int len=a.len,yushu,shang;
for(int i=len;i>=1;i--){
yushu=a[i]%b;
shang=a[i]/b;
a[i]=shang;
a[i-1]+=yushu*10;
}
a.flatten(len+1);//最后需要‘展开’一个,避免前导0的出现
return a;
}
int main()
{
Bigint ans(0),fac(1);
int m;
cin>>m;
for(int i=1;i<=m;i++){
fac=fac*i;
ans=ans+fac;
}
ans.print();
return 0;
}