const int maxn=3000;
struct bign
{
int len,s[maxn];
bign(){memset(s,0,sizeof(s));len=1;}
};
上面的结构体中有一个函数,称为构造函数,它是c++中特有的,作用是进行初始化。事实上,当定义bign X时候,就会执行这个函数,把x.s清零,并赋值x.len=1;
需要注意的是在c++中,并不需要typedef就可以直接用结构体名来定义,而且提供自动初始化的功能
我们重新定义赋值运算符(下面的函数要写在bign结构体定义的内部)
bign operator=(const char *num)
{
len=strlen(num);
for(int i=0;i<len;i++){
s[i]=num[len-i-1]-'0';
}
return *this;
}
可以把字符串转化为逆序数组+长度的内部表示方式
为了让它支持x=1234这样更加常用的赋值方式,还需要再定义一种赋值运算(仍然定义在结构体内部)
bign operator=(int num)
{
char s[maxn];
sprintf(s,"%d",num);
*this=s;
return *this;
}
关于sprintf函数
sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,sprintf 在大多数场合可以替代
itoa。
如:
//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
可以指定宽度,不足的左边补空格:
sprintf(s, "%4d%4d", 123, 4567); //产生:" 1234567"
当然也可以左对齐:
sprintf(s, "%-4d%4d", 123, 4567); //产生:"123 4567"
也可以按照16 进制打印:
struct bign
{
int len,s[maxn];
bign(){memset(s,0,sizeof(s));len=1;}
bign operator=(const char *num)
{
len=strlen(num);
for(int i=0;i<len;i++){
s[i]=num[len-i-1]-'0';
}
return *this;
}
bign(int num){*this=num;}
bign(const char* num;)
bign operator=(int num)
{
char s[maxn];
sprintf(s,"%d",num);
*this=s;
return *this;
}
string str()const
{
string res="";
for(int i=0;i<len;i++){
res=(char)(s[i]+'0')+res;
}
if(res==""){
res="0";
}
return res;
}
};
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,
右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐
注意可以用bign x;x=100;来声明一个x并给它赋值,却不能把它写成bign x=100;应为这个时候bign=100是初始化,而非普通的赋值操作,为了让代码支持初始化操作,需要加2个函数
bign(int num){*this=num;}
bign(const char* num;)
刚刚它们只是简单调用刚才的赋值运算符
string str()const//const表明它x.str()不会改变x,
{
string res="";
for(int i=0;i<len;i++){
res=(char)(s[i]+'0')+res;
}
if(res==""){
res="0";
}
return res;
}
istream& operator>>(istream &in,bign &x)
{
string s;
in>>s;
x=s,c_str();
return in;
}
{
ostream operator<<(ostream &out,const bign&x)
{
out<<x.str();
return out;
}
}
这样就可以用cout<<x的方式打印它
重新定义了>>和<<运算符,让输入输出直接支持我们的bign结构体,这2个函数要定义再结构体bign的外边,不要写在里面