看不懂的高精度运算

设计一个结构体bign来存储高精度非负整数:
const int maxn=1000;
struct bign
{
int len,s[maxn];
bign(){memset(s,0,sizeof(s));len=1;}
};

len表示位数,而s数组就是具体的各个数字。
上面的结构体中有一个函数,称为构造函数。构造函数是C++中特有的,作用是进行初始化。当定义bign x时,就会执行这个函数,把x.s清零,并赋值x.len=1。

重新定义赋值运算符
bign operator=(const char*num)
{
len=strlen(num);
for(int i=0;i<len;i++)s[i]=num[len-i-1]-‘0’; //减‘0’为了转换成int 型
return *this;
}
即可以用x=“123456789”这样的方式给x赋值,它会把这个字符串转化为“逆序数组+长度”的内部表示方式。
为了让它支持x=1234这样更常用的赋值方式,还需要再定义另一种赋值运算
bidn operator=(int num)
{
char s[maxn];
sprintf(s,"%d",num);
*this=s;
return *this;
}

可以用bign x;x=100;来声明一个x并给它赋值,却不能把它写成“bign x=100;"。bign x=100是初始化,而非普通的赋值操作。
为了让代码支持”初始化“操作,需要增加两个函数
bign (int num){this=num;}
bign (const char
num){*this=num;} //只是简单调用赋值运算符
接下来需要提供一个函数把它转化为字符串
string str() const
{
string res="";
for(int i=0;i<len;i++) res=(char)(s[i]+‘0’)+res;
if(res=="")res=“0”;
return res;
}

注意函数定以后的const关键字,它表明”x.str()不会改变x“
str()是结构体bign的成员函数

重新定义>>和<<运算符

istream& operator>>(isteam &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直接打印

发布了22 篇原创文章 · 获赞 33 · 访问量 1083

猜你喜欢

转载自blog.csdn.net/qq_42577542/article/details/89228422
今日推荐