蒟蒻写的结构体高精度模板(仅供参考思路)
  • 板块灌水区
  • 楼主Light_az
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/8/21 11:51
  • 上次更新2023/10/27 14:20:10
查看原帖
蒟蒻写的结构体高精度模板(仅供参考思路)
654958
Light_az楼主2022/8/21 11:51
#include<bits/stdc++.h>
using namespace std;

const int N=1005;

struct bigNumber{
	
	
//1.基础部分

		
	int x[N];
	int len;
	bigNumber(){
		memset(x,0,sizeof(x));
		len=1;
	}//初始化定义 
	
	void read(){
		string s;
		cin>>s;
		for(int i=0;i<s.size();i++) x[s.size()-i]=s[i]-'0';
		len=s.size();
	}//读入数字,翻转并记录长度
	
	
//2.高精度和int的算式部分 

	
	friend bigNumber operator+(bigNumber a,int b){
		a.x[1]+=b;
		return fix(a);
	}//定义 高精度+int 的加法
	
	friend bigNumber operator-(bigNumber a,int b){
		a.x[1]-=b;
		return fix(a);
	}//定义 高精度-int 的减法
		
	friend bigNumber operator*(bigNumber a,int b){
		for(int i=1;i<=a.len;i++) a.x[i]*=b;
		return fix(a);
	}//定义 高精度*int 的乘法 
		
	friend bigNumber operator/(bigNumber a,int b){
		int x=0;
		bigNumber c;
		c.len=a.len;
		for(int i=c.len;i>0;i--){
			c.x[i]=(x*10+a.x[i])/b;
			x=(x*10+a.x[i])%b;
		}
		return fix(c);
	}//定义 高精度/int 的除法 
	
	
//3.高精度和高精度的算式 
	
	
	friend bigNumber operator+(bigNumber a,bigNumber b){
		bigNumber c;
		c.len=max(a.len,b.len);
		for(int i=1;i<=c.len;i++) c.x[i]=a.x[i]+b.x[i];
		return fix(c);
	}//定义 高精度+高精度 的加法 
	
	friend bigNumber operator-(bigNumber a,bigNumber b){
		bigNumber c;
		c.len=max(a.len,b.len);
		for(int i=1;i<=c.len;i++) c.x[i]=a.x[i]-b.x[i];
		return fix(c);
	}//定义 高精度-高精度 的减法 
	
	friend bigNumber operator*(bigNumber a,bigNumber b){
		bigNumber c;
		c.len=max(a.len,b.len);
		for(int i=1;i<=a.len;i++) 
			for(int j=1;j<=b.len;j++)
				c.x[i+j-1]+=a.x[i]*b.x[j];
		return fix(c);
	}//定义 高精度*高精度 的乘法 
	
	
//4.函数fix的编写部分

	
	friend bigNumber fix(bigNumber a){
		for(int i=1;i<a.len;i++){
			if(a.x[i]<0) a.x[i]==10,--a.x[i+1];
			a.x[i+1]+=a.x[i]/10;
			a.x[i]%=10;
		}
		while(a.x[a.len]>9){
			a.x[a.len+1]+=a.x[a.len]/10;
			a.x[a.len]%=10;
			++a.len;
		}
		while(a.len>1&&!a.x[a.len]) --a.len;
		if(a.x[a.len]<0)
		{
			bigNumber c;
			c.len=a.len;
			c.x[c.len]=-a.x[a.len];
			a.x[a.len--]=0;
			a=c-a;
			a.x[a.len]*=-1;
		}
		return a;
	} 
	
	
//5.输出部分


	void print(){
		for(int i=len;i>0;i--)	printf("%d",x[i]);
		printf("\n");
	} 
	
	
};
int main(){
	/*使用说明: 
		用bignumber定义的数是大整数
		用int定义的数是整型
		下面的a和b是大整数
		c是整型
		
		大整数(a,b)用 name.read()读入
		整型(c)用 cin读入
		(name+name).print() 是输出
		
		也可以这么写
		(a+b-c).print()
		(a*b-c).print()
		
		忌:本蒟蒻没有定义 () 所以运算优先级按 加减乘除 
		还有此程序没有高精度除法和取余 仅供参考思路 
	*/ 
	bigNumber a,b;
	int c,d; 
	a.read(); 
	b.read();
	(a*b).print();
	return 0;
}
2022/8/21 11:51
加载中...