设计一个结构体bign来存贮高精度非负整数

来源:互联网 发布:乐知英语在哪里 编辑:程序博客网 时间:2024/04/30 15:00
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的外边,不要写在里面



0 0
原创粉丝点击