C++中,用类和重载运算符写高精模板

先放代码:

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct bign
{
	int len,s[1000];
	bign(){len=1;memset(s,0,sizeof(s));}//构造函数,用来初始化成员变量 
	bign(int num){*this=num;}//拷贝构造函数,用来实现bign a=1234; 
	bign(char *num){*this=num;}//拷贝构造函数,用来实现bign a="1234"; 
	bign operator =(const char *num)//重载=运算符,实现a=1234,括号中是=后接的数,以下是高精赋值,返回要返回结果 
	{
		len=strlen(num);
		for(int i=0;i<len;i++)s[i]=num[len-i-1]-'0';
		return *this;//*this代表当前结构体 
	}
	bign operator =(const int num)//重载=运算符,实现a="1234" 
	{
		char a[1000];
		sprintf(a,"%d",num);
		*this=a;
		return *this;
	}
	bign operator +(bign &a)//重载+运算符,以下是高精加代码 
	{
		bign c;
		c.len=max(len,a.len)+1;//默认两数相加进位 
		for(int i=0,x=0;i<c.len;i++)
		{
			c.s[i]=s[i]+a.s[i]+x;
			x=c.s[i]/10;
			c.s[i]%=10;
		}
		if(c.s[c.len-1]==0)c.len--;//如果没有进位,长度-1 
		return c;
	}
	bign operator +=(bign &a)//重载+=运算符
	{
		*this=*this+a;
		return *this;
	}
	bool operator <(bign &x)
	{
		if(len!=x.len)return len<x.len;//不能有前导0 
		for(int i=len-1;i>=0;i--)
		if(s[i]!=x.s[i])
		return s[i]<x.s[i];
		return false;//全部相等,<不成立 
	}
	bool operator >(bign &x){return x<*this;}//方便的是,只要重载< 运算符,其他关系运算符都可以表示出来 
	bool operator <=(bign &x){return !(x<*this);}
	bool operator >=(bign &x){return !(*this<x);}
	bool operator ==(bign &x){return !(x<*this||*this<x);}
	bool operator !=(bign &x){return x<*this||*this<x;}
};
ostream& operator <<(ostream &out,bign &x)//重载<<,实现cout<<a; 
{
	for(int i=x.len-1;i>=0;i--)cout<<x.s[i];
	return out;
}
istream& operator >>(istream &in,bign &x)//重载>>,实现cin>>a; 
{
	char num[1000];
	in>>num;
	x=num;
	return in;
}
int main()
{
	bign a,b,c;
	cin>>a>>b;
	c=a+b;
	cout<<c<<endl;
	return 0;
}

 

  

 

有人问
各种const是干什么的?
其实在这里,const的作用只是“增加程序可读性”,就是表示“这是一个不可改变的量”。
还有人问

 

	bign(int num){*this=num;}
	bign(char *num){*this=num;}

 

是用来干什么的?
其实这个与bign a=123;bign a="1234";有关,就是在定义的时候赋值。
为什么用=呢?C++编译器可以自动区别赋值和初始化(构造函数是初始化),对于算法,只要记住就可以了。

本文相关知识:http://blog.csdn.net/c20190102/article/details/70738801

posted @ 2017-06-11 21:08  银河渡舟  阅读(364)  评论(0编辑  收藏  举报