用C++知识作答并解释每一行。设计一个求两个大整数四则运算的类。要求如下。 (1)类中私有数据成员为2个运算数及位数、运算结果。 (2)公有成员函数包括:构造函数和析构函数;接收数据的函数;和函数;差函数; 积函数;除函数;显示函数;清零函数等。 程序运行结果如下所示: Please enter one: 1234567 please enter two: 2345678 one+two=3580245 one-two=-1111111 one*two=2895896651426 one/two=52631742743
时间: 2023-06-17 15:05:43 浏览: 90
以下是C++代码实现:
```c++
#include <iostream>
#include <cstring>
using namespace std;
class BigNum {
private:
char num1[100], num2[100], result[200]; // 运算数及结果
int len1, len2, len; // 运算数的位数
public:
BigNum() {
memset(num1, 0, sizeof(num1)); // 初始化数组
memset(num2, 0, sizeof(num2));
memset(result, 0, sizeof(result));
len1 = len2 = len = 0;
}
~BigNum() {}
void input() {
cout << "please enter one: ";
cin >> num1;
cout << "please enter two: ";
cin >> num2;
len1 = strlen(num1);
len2 = strlen(num2);
}
void add() {
int carry = 0, i = len1 - 1, j = len2 - 1, k = 0;
while (i >= 0 || j >= 0) {
int x = i >= 0 ? num1[i--] - '0' : 0;
int y = j >= 0 ? num2[j--] - '0' : 0;
int sum = x + y + carry;
result[k++] = sum % 10 + '0';
carry = sum / 10;
}
if (carry) result[k++] = carry + '0';
len = k;
for (i = 0, j = len - 1; i < j; i++, j--) swap(result[i], result[j]);
}
void minus() {
int borrow = 0, i = len1 - 1, j = len2 - 1, k = 0;
while (i >= 0 || j >= 0) {
int x = i >= 0 ? num1[i--] - '0' : 0;
int y = j >= 0 ? num2[j--] - '0' : 0;
int diff = x - y - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
result[k++] = diff + '0';
}
while (k > 1 && result[k - 1] == '0') k--;
len = k;
for (i = 0, j = len - 1; i < j; i++, j--) swap(result[i], result[j]);
}
void multiply() {
int i, j, carry = 0;
for (i = len1 - 1; i >= 0; i--) {
carry = 0;
for (j = len2 - 1; j >= 0; j--) {
int tmp = (num1[i] - '0') * (num2[j] - '0') + carry + result[i + j + 1] - '0';
result[i + j + 1] = tmp % 10 + '0';
carry = tmp / 10;
}
result[i] += carry;
}
len = len1 + len2;
while (len > 1 && result[len - 1] == '0') len--;
}
void divide() {
int i, j, k;
char tmp[100];
memset(tmp, 0, sizeof(tmp));
for (i = 0; i < len1; i++) {
for (k = len - 1; k > 0; k--) result[k] = result[k - 1];
result[k] = num1[i];
while (len > len2 || (len == len2 && strcmp(result, num2) >= 0)) {
minus();
for (j = 0; j < len; j++) tmp[j] = result[j];
tmp[j] = '\0';
}
num1[i] = tmp[0];
for (j = 0; j < len - 1; j++) result[j] = tmp[j + 1];
result[j] = '\0';
len--;
while (len > 1 && result[len - 1] == '0') len--;
}
strcpy(result, tmp);
len = strlen(result);
}
void display() {
cout << "one+two=" << result << endl;
}
void clear() {
memset(num1, 0, sizeof(num1));
memset(num2, 0, sizeof(num2));
memset(result, 0, sizeof(result));
len1 = len2 = len = 0;
}
};
int main() {
BigNum num;
num.input();
num.add();
num.display();
num.clear();
num.input();
num.minus();
num.display();
num.clear();
num.input();
num.multiply();
num.display();
num.clear();
num.input();
num.divide();
cout << "one/two=" << num.result << endl;
return 0;
}
```
解释:
1. 定义一个名为`BigNum`的类,包含私有成员变量`num1`、`num2`、`result`以及它们的长度`len1`、`len2`、`len`,分别表示两个运算数、运算结果以及它们的长度。
2. 实现一个默认的构造函数和析构函数,用于初始化和清理成员变量。
3. 实现一个`input()`函数,用于从用户输入中读取两个运算数,并计算它们的长度。
4. 实现四个运算函数`add()`、`minus()`、`multiply()`、`divide()`,分别对应加、减、乘、除四种运算。具体实现方法请看代码注释。
5. 实现一个`display()`函数,用于输出运算结果。
6. 实现一个`clear()`函数,用于清空成员变量。
7. 在`main`函数中调用`BigNum`类中的各个函数,实现四则运算,并输出结果。
阅读全文