创建大整数类型 (1)创建一个更大的无符号长整型(精度可达1000位十进制) (2)创建该类型,都需要设计哪些内容?(存储表示,数据范围,运算,进位、输出) 设计完成100位大整数类的加、减、乘、除运算符重载。
时间: 2023-06-25 16:07:25 浏览: 101
1. 创建更大的无符号长整型
在实现更大的无符号长整型时,需要考虑以下内容:
- 存储表示:可以使用数组来存储该类型的值,数组中的每个元素代表该数的一位,因为每一位只有0~9这10种可能的取值,所以每个元素只需要占用4位二进制即可。
- 数据范围:该类型的数据范围应该是0~999...(1000个9),即能够表示1000位十进制的最大值。
- 运算:需要实现该类型的加、减、乘、除等基本运算,同时还要实现比较、取反等相关运算。
- 进制转换:需要实现将该类型的值转换为十进制字符串的方法,以便输出或进行其他操作。
2. 大整数类的设计
在设计大整数类时,需要包括以下内容:
- 构造函数:用于初始化大整数的值。
- 运算符重载:包括加、减、乘、除等基本运算符的重载,以及比较、取反等相关运算符的重载。
- 存储表示:使用数组来存储大整数的值,并且需要考虑数组的大小限制和动态扩展等问题。
- 进制转换:实现将大整数的值转换为十进制字符串的方法,以便输出或进行其他操作。
下面是100位大整数类的加、减、乘、除运算符重载的实现:
```c++
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
class BigInteger {
public:
BigInteger() { memset(num, 0, sizeof(num)); }
BigInteger(string s) {
memset(num, 0, sizeof(num));
int len = s.length();
for (int i = 0; i < len; i++) {
num[i] = s[len - i - 1] - '0';
}
}
BigInteger operator+(const BigInteger &b) const {
BigInteger res;
for (int i = 0; i < MAXN; i++) {
res.num[i] += num[i] + b.num[i];
res.num[i + 1] += res.num[i] / 10;
res.num[i] %= 10;
}
return res;
}
BigInteger operator-(const BigInteger &b) const {
BigInteger res;
for (int i = 0; i < MAXN; i++) {
res.num[i] = num[i] - b.num[i];
if (res.num[i] < 0) {
res.num[i] += 10;
num[i + 1]--;
}
}
return res;
}
BigInteger operator*(const BigInteger &b) const {
BigInteger res;
for (int i = 0; i < MAXN; i++) {
for (int j = 0; j < MAXN - i; j++) {
res.num[i + j] += num[i] * b.num[j];
res.num[i + j + 1] += res.num[i + j] / 10;
res.num[i + j] %= 10;
}
}
return res;
}
BigInteger operator/(const BigInteger &b) const {
BigInteger res, current = 0;
for (int i = MAXN - 1; i >= 0; i--) {
current = current * 10 + num[i];
int d = 0;
while (current >= b) {
current = current - b;
d++;
}
res.num[i] = d;
}
return res;
}
bool operator<(const BigInteger &b) const {
for (int i = MAXN - 1; i >= 0; i--) {
if (num[i] < b.num[i]) return true;
else if (num[i] > b.num[i]) return false;
}
return false;
}
bool operator>(const BigInteger &b) const {
for (int i = MAXN - 1; i >= 0; i--) {
if (num[i] > b.num[i]) return true;
else if (num[i] < b.num[i]) return false;
}
return false;
}
bool operator==(const BigInteger &b) const {
for (int i = 0; i < MAXN; i++) {
if (num[i] != b.num[i]) return false;
}
return true;
}
bool operator<=(const BigInteger &b) const {
return (*this) < b || (*this) == b;
}
bool operator>=(const BigInteger &b) const {
return (*this) > b || (*this) == b;
}
string toString() const {
string res = "";
int i;
for (i = MAXN - 1; i >= 0 && num[i] == 0; i--);
if (i < 0) return "0";
for (; i >= 0; i--) {
res += num[i] + '0';
}
return res;
}
private:
int num[MAXN];
};
int main() {
string a, b;
cin >> a >> b;
BigInteger A(a), B(b);
cout << (A + B).toString() << endl;
cout << (A - B).toString() << endl;
cout << (A * B).toString() << endl;
cout << (A / B).toString() << endl;
return 0;
}
```