Kai’blog

主博客 | 势利纷华,近之而不染者洁,不近者亦洁,君子不立危墙之下。

大数类

在写P1009时需要大数运算,就顺便把整个大数类都写出来了,因为P1009中用不到某些功能(比如重载运算符号,减法,除法等),所以就没写哪些功能,等到以后需要用的的时候在写上并更新此处的代码
Code

class bigint
{
	//静态参数 
	static const int Max=1000;
	//友元函数 
	friend bigint add(bigint a,bigint b);
	friend bigint multi(bigint a,bigint b);
	
	public:	
	int size;
	//构造函数 
	bigint();
	bigint(int x);
	bigint(long long int x);
	//类方法 
	void assign(long long int x);
	void print();
	
	private:
	int num[Max];
};
bigint::bigint()
{
	size=1;
	for(int i=0;i<Max;i++)
	{
		num[i]=0;
	}
}
bigint::bigint(int x)
{
	for(int i=0;i<Max;i++)
	{
		num[i]=0;
	}
	if(x==0)
	{
		size=1;
		return; 
	}
	int p=1;
	size=0;
	while(x!=0)
	{
		num[p]=x%10000;
		x/=10000;
		p++;
		size++;
	}
}
bigint::bigint(long long int x)
{
	for(int i=0;i<Max;i++)
	{
		num[i]=0;
	}
	if(x==0)
	{
		size=1;
		return; 
	}
	int p=1;
	size=0;
	while(x!=0)
	{
		num[p]=x%10000;
		x/=10000;
		p++;
		size++;
	}
}

void bigint::assign(long long int x)
{
	int p=1;
	size=0;
	while(x!=0)
	{
		num[p]=x%10000;
		x/=10000;
		p++;
		size++;
	}
}
void bigint::print()
{
	for(int p=size;p>=1;p--)
	{
		if(num[p]<10&&p!=size)cout<<'0';
		if(num[p]<100&&p!=size)cout<<'0';
		if(num[p]<1000&&p!=size)cout<<'0';
		cout<<num[p];
	}
}
bigint add(bigint a,bigint b)
{
	bigint c;
	int p=1;
	while(p<=a.size||p<=b.size)
	{
		int x=a.num[p]+b.num[p];
		c.num[p+1]+=x/10000;
		c.num[p]+=x%10000;
		p++;
	}
	c.size=max(a.size,b.size);
	if(a.size==b.size&&c.num[c.size+1]!=0)
	{
		c.size++;
	}
	return c;
}
bigint multi(bigint a,bigint b)
{
	bigint c;
	for(int i=a.size;i>=1;i--)
	{
		for(int j=b.size;j>=1;j--)
		{
			int x=a.num[i]*b.num[j];
			c.num[i+j-1]+=x%10000;
			c.num[i+j]+=x/10000;
		}
	}
	c.size=a.size+b.size-1;
	if(c.num[a.size+b.size]!=0)
	{
		c.size++;
	}
	return c;
}```
posted @ 2023-07-02 12:14  Kai-G  阅读(21)  评论(0编辑  收藏  举报
Copyright © 2019-2020 拱垲. All rights reserved.