注意:
```只需要考虑非负情况!在测试时也将保证不会出现负数。在减法中结果也不会为负数。
目前已有的整数类仍有一些缺陷,例如int的存储范围为 [-2^31, 2^31 - 1]。因此mfc希望实现MyInteger类,并可以高效地实现部分操作。你需要实现的操作有:
构造函数:
MyInteger() //默认构造很熟构造函数, 默认值为0
MyInteger(string& num) // 构造函数,从字符符串构造为大整数。
MyInteger(int num) // 构造函数,从整型构造为大整数。
~MyInteger() // 析构函数
成员函数:
string getnum() // 返回表示大整数的字符字符串,注意去除前导零。
例:
MyInteger bint(123);
cout << bint.getnum() << endl;
// will output "123"
MyInteger bint("01895");
cout << bint.getnum() << endl;
// will output "1895"
```c++
MyInteger operator+(const MyInteger& bint2) //大整数加法
MyInteger operator-(const MyInteger& bint2) //大整数减法
MyInteger operator-(const MyInteger& bint2) //大整数乘法
按照顺序测试以下函数:
getnum 函数 (20pts)
加法重载 (30pts)
减法重载 (30pts)
乘法重载 (20pts)
下面是写好的私有成员变量
class MyInteger{
private:
string num;
public:
//balabala
};
就是用数字字符进行运算。
运行结果:
代码:
#include <iostream>
#include <string>
using namespace std;
#define MAXNUM (int)300
class MyInteger{
private:
string num;
public:
MyInteger(){num="0";}
MyInteger(string s){num = s;}
~MyInteger(){}
string getnum(){return num;}
void setnum(string s){num =s;}
MyInteger operator+(const MyInteger& bint2) //大整数加法
{
char* a = new char[MAXNUM];
char* b = new char[MAXNUM];
char* c = new char[MAXNUM];
strcpy(a,num.c_str());
strcpy(b,bint2.num.c_str());
bigAdd(a,b,c);
MyInteger res(c);
free(a);a=0;
free(b);b=0;
free(c);c=0;
return res;
}
MyInteger operator-(const MyInteger& bint2) //大整数减法
{
char* a = new char[MAXNUM];
char* b = new char[MAXNUM];
char* c = new char[MAXNUM];
string flag ="";
strcpy(a,num.c_str());
strcpy(b,bint2.num.c_str());
if(num.length() > bint2.num.length())
bigSub(a,b,c);
else if(num.length() < bint2.num.length())
{
flag ="-";
bigSub(b,a,c);
}else
{
if(strcmp(num.c_str(),bint2.num.c_str())> 0)
bigSub(a,b,c);
else if(strcmp(num.c_str(),bint2.num.c_str())<0)
{
flag ="-";
bigSub(b,a,c);
}else
{
free(a);a=0;
free(b);b=0;
free(c);c=0;
return MyInteger("0");
}
}
string str = c;
MyInteger res(flag + str);
free(a);a=0;
free(b);b=0;
free(c);c=0;
return res;
}
MyInteger operator*(const MyInteger& bint2) //大整数乘法
{
char* a = new char[MAXNUM];
char* b = new char[MAXNUM];
char* c = new char[MAXNUM];
strcpy(a,num.c_str());
strcpy(b,bint2.num.c_str());
bigMul(a,b,c);
MyInteger res(c);
free(a);a=0;
free(b);b=0;
free(c);c=0;
return res;
}
private:
//去除前面的0
void movePreZero(char c[])
{
int i;
while (c[0] == '0')
{
for (i = 0; i < strlen(c) - 1; i++)
c[i] = c[i + 1];
c[strlen(c) - 1] = 0;
}
}
//大数相加
void bigAdd(char a[], char b[], char c[])
{
int i = 0;
int shift = 0, val;
int l1 = strlen(a);
int l2 = strlen(b);
int len = l1 > l2 ? l1 : l2;
len += 1; //多留一个进位
c[len] = 0; //后一个位置为0
//从后往前迭代
l1--;
l2--;
len--;
while (l1 >= 0 && l2 >= 0)
{
int t = (a[l1] - '0') + (b[l2] - '0') + shift;
if (t >= 10)
{
shift = 1;
t -= 10;
c[len] = '0' + t;
}
else
{
shift = 0;
c[len] = '0' + t;
}
len--;
l1--;
l2--;
}
//a
while (l1 >= 0)
{
int t = (a[l1] - '0') + shift;
if (t >= 10)
{
shift = 1;
t -= 10;
c[len] = '0' + t;
}
else
{
shift = 0;
c[len] = '0' + t;
}
len--;
l1--;
}
//b
while (l2 >= 0)
{
int t = (b[l2] - '0') + shift;
if (t >= 10)
{
shift = 1;
t -= 10;
c[len] = '0' + t;
}
else
{
shift = 0;
c[len] = '0' + t;
}
len--;
l2--;
}
if (shift != 0)
c[0] = '0' + shift;
else
c[0] = '0';
movePreZero(c);
}
//大数相乘
void bigMul(char a[], char b[], char c[])
{
int i, j, t, k, val;
int maxlen;
int shift = 0;
int l1 = strlen(a);
int l2 = strlen(b);
char tmp[MAXNUM] = { 0 };
//结果最多是l1+l2位数
maxlen = l1 + l2;
c[maxlen] = 0; //字符串正常结束
for (i = 0; i < maxlen; i++)
c[i] = '0';
if (l1 < l2)
{
//交换a和b
strcpy(tmp, a);
strcpy(a, b);
strcpy(b, tmp);
t = l1;
l1 = l2;
l2 = t;
}
for (t = 0, i = l2 - 1; i >= 0; i--, t++) //遍历b,乘以a的所有数
{
shift = 0;
memset(tmp, '0', maxlen);
tmp[maxlen] = 0;
for (k = 0, j = l1 - 1; j >= 0; j--, k++)
{
val = (b[i] - '0') * (a[j] - '0') + shift;
if (val >= 10)
{
shift = val / 10;
val = val % 10;
}
else
shift = 0;
tmp[maxlen - 1 - t - k] = '0' + val;
}
if (shift)
tmp[maxlen - 1 - t - k] = '0' + shift;
//print(tmp);
shift = 0;
//计算c与tmp的和
for (k = maxlen - 1; k >= 0; k--)
{
if (tmp[k] == 0)
continue;
else
{
val = c[k] - '0' + tmp[k] - '0' + shift;
if (val >= 10)
{
shift = val / 10;
val = val % 10;
}
else
shift = 0;
c[k] = '0' + val;
}
}
}
movePreZero(c);
}
//大数相减,成功返回1,a<b返回0
int bigSub(char a[], char b[], char c[])
{
int i = 0;
int shift = 0, val;
int l1 = strlen(a);
int l2 = strlen(b);
if (l1 < l2)
{
c[0] = 0;
return 0;
}
//b后移l1-l2位,并且前面补0
for (i = l2 - 1; i >= 0; i--)
b[i + l1 - l2] = b[i];
for (i = 0; i < l1 - l2; i++)
b[i] = '0';
b[l1] = 0;
//逐位相减
i = l1 - 1;
c[l1] = 0;
while (i >= 0)
{
val = a[i] - b[i] - shift;
if (val < 0)
{
val += 10;
shift = 1;
}
else
shift = 0;
c[i] = '0' + val;
i--;
}
if (shift)
{
c[0] = 0;
return 0;
}
//去除前面的0
movePreZero(c);
//去除b前面的0
movePreZero(b);
//printf("%s",c);
if (strlen(c) == 0)
{
c[0] = '0'; //留1个0
c[1] = 0;
}
return 1;
}
};
int main()
{
MyInteger a("123456789");
MyInteger b("9876543210");
MyInteger c = a+b;
MyInteger d = a-b;
MyInteger e = a*b;
cout << "a="<<a.getnum()<<endl;
cout << "b="<<b.getnum()<<endl;
cout << "c=a+b="<<c.getnum()<<endl;
cout << "d=a-b="<<d.getnum()<<endl;
cout << "e=a*b="<<e.getnum()<<endl;
return 0;
}
问题是