练习基本上是照着源码打的,,主要是各种const想不清楚原因和来由。
以下是自己的代码,已存为bign.h
#include <stdio.h>
#include <iostream>
#include <string> //此处不用.h
using namespace std;//使用命名空间std
struct bign//C++中取消了tpyedef
{
//this 关键字表示的意思是 &x 所以用*this才能操作 不过为什么不能*this.len呢?
int len,s[3000];// 定义成员变量
//定义构造函数 C++专属
bign()
{
len=1;
memset(s,0,sizeof(s));
}
//定义对于数组的=运算法则
bign operator = (const char* num)//此处的const何用?
{
len = strlen(num);
for(int i=0;i<len;i++)
s[i]=num[len-1-i]-'0';
//s[len-1-i]=num[i]-'0';
return *this;
}
//定义对于int变量的=运算法则
bign operator = (const int num)
{
char t[3000];
sprintf(t,"%d",num);
*this=t;//此处已经运用了对于数组的赋值运算法则 len,s已经在内部实现
return *this;
}
//定义初始化方法
bign(int num) {*this = num;}
bign(const char* num) {*this = num;}//此处要求必须为常量数组
// 定义成员函数
string str()const//此处的const表示不会在x.str()函数内部改变x的值
{
string res="";//为string变量初始化
for(int i=0;i<len;i++)
res = (char)(s[i]+'0')+res;//res累加顺序
if(res=="") res="0";
return res;
}
//定义加法
bign operator + (const bign& b) const //返回一个bign的运算结果
{
bign res;
res.len=0;
for(int i=0,g=0;g||i<max(len,b.len);i++)
{
int x = g; //从上一次运算中取出累加余量
if(i<len)
x += s[i];
if(i<b.len)
x += b.s[i];
res.s[res.len++]=x%10;
g=x/10;
}
return res;
}
//定义乘法
bign operator * (const bign& b) const //返回一个bign的运算结果
{
bign res;
res.len=0;
for(int i=0;i<b.len;i++)
{
int g=0;
bign tem;
tem.len=0;
for(int k=0;k<i;k++)
{
//tem.s[tem.len++]=0;
tem.len++;
}
for(int j=0;j<len;j++)
{
int x = g + s[j]*b.s[i]; //从上一次运算中取出累乘余量
tem.s[tem.len++]=x%10;
g=x/10;
}
res = res + tem;
}
return res;
}
//定义比较符号
bool operator < (const bign &b )const
{
if(len!=b.len)
return len<b.len;
else
{
for(int i=len-1;i>0;i--)
{
if(s[i]!=b.s[i])
return s[i]<b.s[i];
}
}
}
bool operator > (const bign& b)const
{ return b<*this;}
bool operator >= (const bign& b)const
{ return !(b>*this);}
bool operator <= (const bign& b)const
{ return !(*this>b);}
bool operator != (const bign& b)const
{ return (*this<b||*this>b);}
bool operator == (const bign& b)const
{ return !(*this != b);}
} ;//";" 太重要了
//为bign定义<<和>>运算符 必须在外部
istream& operator >>(istream &in,bign& x)//&的位置有关系么?
{
string s;
in>>s;//in表示输入的流
x=s.c_str();//把string 转换为char*
return in;
}
ostream& operator <<(ostream &out,const bign& x)//此处要求x为const的
{
out<<x.str();
return out;
}
提出了几个疑问,
1.为什么不能*this.len
2.bign operator = (const char* num)//此处的const何用?
3.istream& operator >>(istream &in,bign& x)//&的位置有关系么?