[C++]高精度 bign (重载运算符版本)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 2000
#define base 10000

struct Bign
{
	int c[maxn],len,sign;
	//初始化
	Bign(){memset(c,0,sizeof(c)),len = 1,sign = 0;}
	//高位清零
	void Zero()
	{
		while(len > 1 && c[len] == 0)len--;
		if(len == 1 && c[len] == 0)sign = 0;
	}
	//压位读入
	void Write(char *s)
	{
		int k = 1,l = strlen(s);
		for(int i = l - 1;i >= 0;i--)
		{
			c[len] += (s[i] - '0') * k;
			k *= 10;
			if(k == base)
			{
				k = 1;
				len++;
			}
		}
	}
	void Read()
	{
		char s[maxn] = {0};
		scanf("%s",s);
		Write(s);
	}
	//输出
	void Print()
	{
		if(sign)printf("-");
		printf("%d",c[len]);
		for(int i = len - 1;i >= 1;i--)printf("%04d",c[i]);
		printf("\n");
	}
	//重载 = 运算符,将低精赋值给高精
	Bign operator = (int a)
	{
		char s[100];
		sprintf(s,"%d",a);
		Write(s);
		return *this;//this只能用于成员函数,表示当前对象的地址
	}
	//重载 < 运算符
	bool operator < (const Bign &a)const
	{
		if(len != a.len)return len < a.len;
		for(int i = len;i >= 1;i--)
		{
			if(c[i] != a.c[i])return c[i] < a.c[i];
		}
		return 0;
	}
	bool operator > (const Bign &a)const
	{
		return a < *this;
	}
	bool operator <= (const Bign &a)const
	{
		return !(a < *this);
	}
	bool operator >= (const Bign &a)const
	{
		return !(*this < a);
	}
	bool operator != (const Bign &a)const
	{
		return a < *this || *this < a;
	}
	bool operator == (const Bign &a)const
	{
		return !(a < *this) && !(*this < a);
	}
	bool operator == (const int &a)const
	{
		Bign b;b = a;
		return *this == b;
	}

	//重载 + 运算符
	Bign operator + (const Bign &a)
	{
		Bign r;
		r.len = max(len,a.len) + 1;
		for(int i = 1;i <= r.len;i++)
		{
			r.c[i] += c[i] + a.c[i];
			r.c[i + 1] += r.c[i] / base;
			r.c[i] %= base;
		}
		r.Zero();
		return r;
	}
	Bign operator + (const int &a)
	{
		Bign b;b = a;
		return *this + b;
	}
	//重载 - 运算符
	Bign operator - (const Bign &a)
	{
		Bign b,c;// b - c
		b = *this;
		c = a;
		if(c > b)
		{
			swap(b,c);
			b.sign = 1;
		}
		for(int i = 1;i <= b.len;i++)
		{
			b.c[i] -= c.c[i];
			if(b.c[i] < 0)
			{
				b.c[i] += base;
				b.c[i + 1]--;
			}
		}
		b.Zero();
		return b;
	}
	Bign operator - (const int &a)
	{
		Bign b;b = a;
		return *this - b;
	}
	//重载 * 运算符
	Bign operator * (const Bign &a)
	{
		Bign r;
		r.len = len + a.len + 2;
		for(int i = 1;i <= len;i++)
		{
			for(int j = 1;j <= a.len;j++)
			{
				r.c[i + j - 1] += c[i] * a.c[j];
			}
		}
		for(int i = 1;i <= r.len;i++)
		{
			r.c[i + 1] += r.c[i] / base;
			r.c[i] %= base;
		}
		r.Zero();
		return r;
	}
	Bign operator * (const int &a)
	{
		Bign b;b = a;
		return *this * b;
	}
	//重载 / 运算符
	Bign operator / (const Bign &b)
	{
		Bign r,t,a;
		a = b;
		//if(a == 0)return r;
		r.len = len;
		for(int i = len;i >= 1;i--)
		{
			t = t * base + c[i];
			int div,ll = 0,rr = base;
			while(ll <= rr)
			{
				int mid = (ll + rr) / 2;
				Bign k = a * mid;
				if(k > t)rr = mid - 1;
				else
				{
					ll = mid + 1;
					div = mid;
				}
			}
			r.c[i] = div;
			t = t - a * div;
		}
		r.Zero();
		return r;
	}
	Bign operator / (const int &a)
	{
		Bign b;b = a;
		return *this / b;
	}
	//重载 % 运算符
	Bign operator % (const Bign &a)
	{
		return *this - *this / a * a;
	}
	Bign operator % (const int &a)
	{
		Bign b;b = a;
		return *this % b;
	}
};

int main()
{
	freopen("Bign.in","r",stdin);
	freopen("Bign.out","w",stdout);
	Bign a,b,c,d,e,f,g;
	a.Read();
	b.Read();
	c = a + b;
	c.Print();
	d = a - b;
	d.Print();
	e = a * b;
	e.Print();
	f = a / b;
	f.Print();
	g = a % b;
	g.Print();
	return 0;
} 

时间: 2024-10-14 01:37:03

[C++]高精度 bign (重载运算符版本)的相关文章

高精度之重载运算符

这篇文章就纯属自娱自乐啦,受时间以及技术原因的限制,这里面的重载,减法支持的功能仅限于减一次(因为没有同是负号的判断),除法仅限于高精除单精(高精除高精的一个个的减或者二分实在是不想写了)-- 结构体片段以及输出操作如下: struct bignum { int len,s[maxn]; char flag; bignum() { len=1; flag='+'; memset(s,0,sizeof(s)); } bignum (int num) { *this=num; } bignum (c

高精度重载运算符

高精度重载运算符模板 struct bign{ //存在性定义 int len, s[2010]; //初始化 bign () {memset(s, 0, sizeof(s)), len = 1;} bign (int num){ *this = num;} bign (char *num) {*this = num;} bign (const char *num){ *this = num;} //重载 = bign operator = (int num) { char s[2010]; s

c++重载运算符梳理

1 #include<iostream> 2 using namespace std; 3 class bign 4 { 5 public:int x; 6 int y; 7 int z; 8 public: 9 bign(int a,int b,int c) 10 { 11 x=a; 12 y=b; 13 z=c; 14 }//注意用友元函数 15 friend bign operator + (bign a,bign b);//重定义+ 16 friend bign operator -

编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符

建议9: 习惯重载运算符 在开发过程中,应该习惯于使用微软提供给我们的语法特性.我想每个人都喜欢看到这样的语法特性: int x = 1; int y = 2; int total = x + y; 而不是用下面的语法来完成一样的事情: int x = 1; int y = 2; int total = int.Add(x, y); 同理,在构建自己的类型时,我们应该始终考虑该类型是否可以用于运算符重载.如果考虑类型Salary,下面的这段代码看起来就不是那么舒服了: Salary mikeIn

重载运算符问题

关于运算符重载: 不允许用户自定义新的运算符,只能对已有的运算符进行重载 重载运算符不允许改变运算符原操作数的个数 重载运算符不能改变运算符的优先级 重载运算符函数不能有默认的参数,会导致参数个数不匹配 可以在类内实现,作为类的成员函数,也可定义为类的友元函数 当运算符重载函数作为类的成员函数时,要求操作数左边必须是一个对象,而函数的参数可以是同类的对象也可以是普通的变量. //作为类成员函数定义: Complex operator+(Complex &c1){ return new Compl

C++学习之重载运算符1

C++除可重载函数之后,还允许定义已有的运算符,这样通过运算符重载可像处理数据使用它们. 先来个代码 1 #include<iostream> 2 using namespace std; 3 4 class num 5 { 6 public: 7 num(){n=1;} 8 ~num(){} 9 int get() const{return n;} 10 void set(int x){n=x;} 11 private: 12 int n; 13 }; 14 15 int main() 16

矩阵求和--重载运算符

C++习题 矩阵求和--重载运算符 [Submit][Status][Web Board] Description 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<"和流提取运算符">>",使之能用于该矩阵的输入和输出. Input 两个2行3列矩阵 Output 矩阵之和 Sample Input 1 2 34 5 67 8 91 2 3 Sa

重载()运算符和重载强制类型转换

// 研究了半宿.最终弄清楚了 // 写了这段測试代码能够非常好的演示效果 class CConvert { public: CConvert(){m_nValue = 10;} // 重载()运算符 int operator ()(); // 重载int强制类型转换 operator int(); protected: private: int m_nValue; }; int CConvert::operator ()() { return m_nValue; } CConvert::ope

C++自学笔记_重载运算符_《C++ Primer》

#include <iostream> #include <stdexcept> using namespace std; class CheckedPtr{ public: CheckedPtr(int *b,int *e,int *c): beg(b),end(e),curr(c){ } CheckedPtr(const CheckedPtr &obj): //复制构造函数 beg(obj.beg),end(obj.end),curr(obj.curr){ } Chec