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

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的外边,不要写在里面



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值