封装高精度+,-,*,/


前言

将高精的+,-,*,/都用结构体封装了一遍


提示:以下是本篇文章正文内容,下面案例可供参考

一、封装高精的+,-,*,/

#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;
}


Je suppose que tu aimes

Origine blog.csdn.net/qq_45879198/article/details/121859758
conseillé
Classement