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
本文作者:银河渡舟
版权声明:本文采用 CC BY-NC-SA 3.0 CN协议进行许可