如何重载可以处理 class largeIntegers 对象的 + 运算符,它可以在数组中存储最多 100 位数字?
How to overload + operator that can work on objects of class largeIntegers that can store a number upto 100 digits in an array?
我正在从 D.S 的一本名为“使用 C++ 的数据结构”的书中学习数据结构。马利克。我目前正在解决以下书面编程练习:
在C++中,最大的int值是2147483647。所以比这个大的整数
不能作为整数存储和处理。同样,如果总和或乘积
两个正整数大于 2147483647,结果会不正确。
存储和操作大整数的一种方法是存储每个单独的数字
数组中的数字。设计 class largeIntegers 以便
此 class 的对象可以存储最多 100 位的整数。超载
运算符 + 和 – 分别加减两个对象的值
其中 class。 (在第 3 章的编程练习中,我们将重载
乘法运算符。)重载赋值运算符以复制
一个大整数的值转换成另一个大整数。过载流
提取和插入运算符,便于输入和输出。你的程序
必须包含适当的构造函数来初始化 class 的对象
大整数。 (提示:将数字作为字符串读取并存储数字
序号相反。添加实例变量来存储数量
数字和数字的符号。)
下面是我的代码:
#include <bits/stdc++.h>
using namespace std;
class largeIntegers {
private:
/* data */
int num[100] = {0};
int digits;
bool isPositive;
public:
friend istream &operator>>(istream &, largeIntegers &);
largeIntegers &operator+(largeIntegers &);
void getLargeInteger(void);
void setLargeInteger(string);
void print(void);
largeIntegers();
largeIntegers(string);
};
int main() {
largeIntegers num1;
cin >> num1;
largeIntegers num2;
num2 = num1;
cin >> num1;
largeIntegers num3;
num3 = num1 + num2;
num3.print();
return 0;
}
largeIntegers &largeIntegers::operator+(largeIntegers &integer) {
largeIntegers temp;
int remainder = 0;
int digi = max(digits, integer.digits);
temp.digits = digi;
for (int i = 0; i < digi; i++) {
temp.num[i] = (remainder + num[i] + integer.num[i]) % 10;
remainder = (remainder + num[i] + integer.num[i]) / 10;
}
if (remainder) {
temp.num[digi] = remainder;
temp.digits++;
}
return temp;
}
largeIntegers::largeIntegers(string n) { setLargeInteger(n); }
largeIntegers::largeIntegers() {
isPositive = true;
digits = 0;
}
void largeIntegers::setLargeInteger(string n) {
int start = 0;
if (n[0] == '-') {
isPositive = false;
start = 1;
}
digits = 0;
for (int i = n.length() - 1; i >= start; i--) {
num[digits] = int(n[i]) - int('0');
digits++;
}
}
void largeIntegers::getLargeInteger(void) {
cout << "Enter a large integer:\n";
string n;
cin >> n;
setLargeInteger(n);
}
istream &operator>>(istream &isObject, largeIntegers &largeInt) {
string num;
isObject >> num;
largeInt.setLargeInteger(num);
return isObject;
}
void largeIntegers::print(void) {
if (!isPositive)
cout << "-";
for (int i = digits - 1; i >= 0; i--) {
cout << num[i];
}
cout << endl;
}
但是我的代码不适用于加法运算。它给出 Segmentation fault (core dumped) 错误。谁能解释一下问题是什么以及如何解决?
问题是您的重载 operator+
正在返回对局部变量的引用。要解决这个问题,您可以改用以下版本的operator+
:
//return by value
largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &integer)
{
largeIntegers temp;
int remainder = 0;
int digi = max(lhs.digits, integer.digits);
temp.digits = digi;
for (int i = 0; i < digi; i++) {
temp.num[i] = (remainder + lhs.num[i] + integer.num[i]) % 10;
remainder = (remainder + lhs.num[i] + integer.num[i]) / 10;
}
if (remainder) {
temp.num[digi] = remainder;
temp.digits++;
}
return temp;
}
为了使上述工作正常,通过在 class:
中添加如下好友声明,使 operator+
成为好友
friend largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &rhs);
可以看到使用上述修改的完整工作程序here并在下面给出:
#include <bits/stdc++.h>
using namespace std;
class largeIntegers {
private:
/* data */
int num[100] = {0};
int digits;
bool isPositive;
public:
friend istream &operator>>(istream &, largeIntegers &);
//i have added this friend declaration
friend largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &rhs);
void getLargeInteger(void);
void setLargeInteger(string);
void print(void);
largeIntegers();
largeIntegers(string);
};
int main() {
largeIntegers num1;
cin >> num1;
largeIntegers num2;
num2 = num1;
cin >> num1;
largeIntegers num3;
num3 = num1 + num2;
num3.print();
return 0;
}
//i have modified the operator+ as shown below
largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &integer)
{
largeIntegers temp;
int remainder = 0;
int digi = max(lhs.digits, integer.digits);
temp.digits = digi;
for (int i = 0; i < digi; i++) {
temp.num[i] = (remainder + lhs.num[i] + integer.num[i]) % 10;
remainder = (remainder + lhs.num[i] + integer.num[i]) / 10;
}
if (remainder) {
temp.num[digi] = remainder;
temp.digits++;
}
return temp;
}
largeIntegers::largeIntegers(string n) { setLargeInteger(n); }
largeIntegers::largeIntegers() {
isPositive = true;
digits = 0;
}
void largeIntegers::setLargeInteger(string n) {
int start = 0;
if (n[0] == '-') {
isPositive = false;
start = 1;
}
digits = 0;
for (int i = n.length() - 1; i >= start; i--) {
num[digits] = int(n[i]) - int('0');
digits++;
}
}
void largeIntegers::getLargeInteger(void) {
cout << "Enter a large integer:\n";
string n;
cin >> n;
setLargeInteger(n);
}
istream &operator>>(istream &isObject, largeIntegers &largeInt) {
string num;
isObject >> num;
largeInt.setLargeInteger(num);
return isObject;
}
void largeIntegers::print(void) {
if (!isPositive)
cout << "-";
for (int i = digits - 1; i >= 0; i--) {
cout << num[i];
}
cout << endl;
}
查看上面代码中的注释来检查我所做的修改
我正在从 D.S 的一本名为“使用 C++ 的数据结构”的书中学习数据结构。马利克。我目前正在解决以下书面编程练习:
在C++中,最大的int值是2147483647。所以比这个大的整数 不能作为整数存储和处理。同样,如果总和或乘积 两个正整数大于 2147483647,结果会不正确。 存储和操作大整数的一种方法是存储每个单独的数字 数组中的数字。设计 class largeIntegers 以便 此 class 的对象可以存储最多 100 位的整数。超载 运算符 + 和 – 分别加减两个对象的值 其中 class。 (在第 3 章的编程练习中,我们将重载 乘法运算符。)重载赋值运算符以复制 一个大整数的值转换成另一个大整数。过载流 提取和插入运算符,便于输入和输出。你的程序 必须包含适当的构造函数来初始化 class 的对象 大整数。 (提示:将数字作为字符串读取并存储数字 序号相反。添加实例变量来存储数量 数字和数字的符号。)
下面是我的代码:
#include <bits/stdc++.h>
using namespace std;
class largeIntegers {
private:
/* data */
int num[100] = {0};
int digits;
bool isPositive;
public:
friend istream &operator>>(istream &, largeIntegers &);
largeIntegers &operator+(largeIntegers &);
void getLargeInteger(void);
void setLargeInteger(string);
void print(void);
largeIntegers();
largeIntegers(string);
};
int main() {
largeIntegers num1;
cin >> num1;
largeIntegers num2;
num2 = num1;
cin >> num1;
largeIntegers num3;
num3 = num1 + num2;
num3.print();
return 0;
}
largeIntegers &largeIntegers::operator+(largeIntegers &integer) {
largeIntegers temp;
int remainder = 0;
int digi = max(digits, integer.digits);
temp.digits = digi;
for (int i = 0; i < digi; i++) {
temp.num[i] = (remainder + num[i] + integer.num[i]) % 10;
remainder = (remainder + num[i] + integer.num[i]) / 10;
}
if (remainder) {
temp.num[digi] = remainder;
temp.digits++;
}
return temp;
}
largeIntegers::largeIntegers(string n) { setLargeInteger(n); }
largeIntegers::largeIntegers() {
isPositive = true;
digits = 0;
}
void largeIntegers::setLargeInteger(string n) {
int start = 0;
if (n[0] == '-') {
isPositive = false;
start = 1;
}
digits = 0;
for (int i = n.length() - 1; i >= start; i--) {
num[digits] = int(n[i]) - int('0');
digits++;
}
}
void largeIntegers::getLargeInteger(void) {
cout << "Enter a large integer:\n";
string n;
cin >> n;
setLargeInteger(n);
}
istream &operator>>(istream &isObject, largeIntegers &largeInt) {
string num;
isObject >> num;
largeInt.setLargeInteger(num);
return isObject;
}
void largeIntegers::print(void) {
if (!isPositive)
cout << "-";
for (int i = digits - 1; i >= 0; i--) {
cout << num[i];
}
cout << endl;
}
但是我的代码不适用于加法运算。它给出 Segmentation fault (core dumped) 错误。谁能解释一下问题是什么以及如何解决?
问题是您的重载 operator+
正在返回对局部变量的引用。要解决这个问题,您可以改用以下版本的operator+
:
//return by value
largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &integer)
{
largeIntegers temp;
int remainder = 0;
int digi = max(lhs.digits, integer.digits);
temp.digits = digi;
for (int i = 0; i < digi; i++) {
temp.num[i] = (remainder + lhs.num[i] + integer.num[i]) % 10;
remainder = (remainder + lhs.num[i] + integer.num[i]) / 10;
}
if (remainder) {
temp.num[digi] = remainder;
temp.digits++;
}
return temp;
}
为了使上述工作正常,通过在 class:
中添加如下好友声明,使operator+
成为好友
friend largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &rhs);
可以看到使用上述修改的完整工作程序here并在下面给出:
#include <bits/stdc++.h>
using namespace std;
class largeIntegers {
private:
/* data */
int num[100] = {0};
int digits;
bool isPositive;
public:
friend istream &operator>>(istream &, largeIntegers &);
//i have added this friend declaration
friend largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &rhs);
void getLargeInteger(void);
void setLargeInteger(string);
void print(void);
largeIntegers();
largeIntegers(string);
};
int main() {
largeIntegers num1;
cin >> num1;
largeIntegers num2;
num2 = num1;
cin >> num1;
largeIntegers num3;
num3 = num1 + num2;
num3.print();
return 0;
}
//i have modified the operator+ as shown below
largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &integer)
{
largeIntegers temp;
int remainder = 0;
int digi = max(lhs.digits, integer.digits);
temp.digits = digi;
for (int i = 0; i < digi; i++) {
temp.num[i] = (remainder + lhs.num[i] + integer.num[i]) % 10;
remainder = (remainder + lhs.num[i] + integer.num[i]) / 10;
}
if (remainder) {
temp.num[digi] = remainder;
temp.digits++;
}
return temp;
}
largeIntegers::largeIntegers(string n) { setLargeInteger(n); }
largeIntegers::largeIntegers() {
isPositive = true;
digits = 0;
}
void largeIntegers::setLargeInteger(string n) {
int start = 0;
if (n[0] == '-') {
isPositive = false;
start = 1;
}
digits = 0;
for (int i = n.length() - 1; i >= start; i--) {
num[digits] = int(n[i]) - int('0');
digits++;
}
}
void largeIntegers::getLargeInteger(void) {
cout << "Enter a large integer:\n";
string n;
cin >> n;
setLargeInteger(n);
}
istream &operator>>(istream &isObject, largeIntegers &largeInt) {
string num;
isObject >> num;
largeInt.setLargeInteger(num);
return isObject;
}
void largeIntegers::print(void) {
if (!isPositive)
cout << "-";
for (int i = digits - 1; i >= 0; i--) {
cout << num[i];
}
cout << endl;
}
查看上面代码中的注释来检查我所做的修改