在类中使用tostring。
#include <iostream>
#include <iomanip>
#include <string>
#include <cassert>
using namespace std;
这是我的课程LargeInteger。我在这里肯定一切都正确。
class LargeInteger {
private:
int id;
int numDigits; // number of digits in LargeInt / size of alloc array
int* digits; // the digits of the LargeInt we are representing
public:
LargeInteger(int value);
~LargeInteger();
string tostring();
};
LargeInteger类的构造函数,其参数为int值。
LargeInteger::LargeInteger(int value)
{
// set this instance id
id = nextLargeIntegerId++;
numDigits = (int)log10((double)value) + 1;
// allocate an array of the right size
digits = new int[numDigits];
// iterate through the digits in value, putting them into our
// array of digits.
int digit;
for (int digitIndex = 0; digitIndex < numDigits; digitIndex++) {
// least significant digit
digit = value % 10;
digits[digitIndex] = digit;
// integer division to chop of least significant digit
value = value / 10;
}
}
析构函数
LargeInteger::~LargeInteger()
{
cout << " destructor entered, freeing my digits" << endl
<< " id = " << id << endl
//<< " value=" << tostring() // uncomment this after you implement tostring()
<< endl;
delete[] this->digits;
}
这是我感到困惑的地方。我在这里放什么我尝试了此操作,但是我不知道将intValue设置为什么才能获取我想要的值。
string LargeInteger::tostring()
{
string intValue;
//intValue = ??
return intValue;
}
主要功能
int main(int argc, char** argv)
{
// test constructors, destructors and tostring()
cout << "Testing Constructors, tostring() and destructor:" << endl;
cout << "-------------------------------------------------------------" << endl;
LargeInteger li1(3483);
cout << "li1 = " << li1.tostring() << endl;
return 0
}
答案 0 :(得分:1)
看一下构造函数,似乎数据结构中的数字数组是一个十进制数字序列,以相反的顺序编码为二进制(值0..9)。
因此1992年将被编码为2,9,9,1。
为了使数字可打印,您需要在其上添加“ 0”。然后,您需要从头开始迭代并连接可打印版本。像这样:
string LargeInteger::tostring()
{
string intValue;
for (int i=numDigits-1; i>=0; i--)
intValue += digits[i] + '0';
return intValue;
}
您可以很好地使用字符串,而不是将数字存储为整数数组,因为字符串可以包含任何二进制数据,包括“ \ 0”。这样可以避免内存分配的麻烦。
如果您这样做的话,还可以使用迭代器和算法,并编写与以下相同的函数:
string LargeInteger::tostring()
{
string intValue(digits.size(),' ');
transform (digits.rbegin(), digits.rend(), intValue.begin(),
[](auto &x){ return x+'0'; }) ;
return intValue;
}
请注意,您的构造函数不适用于负数,因为log10()
的负数会引发异常。
可以用绝对数字更正:
numDigits = (int)log10(abs((double)value)) + 1;
但是,对负数使用取模可得到负数。这意味着我们需要tostring()
进行更改以使用每个数字的绝对值,并且如果任何数字为负,则在数字的开头添加一个负号(请参见online demo here)。
更方便的方法是在类级别具有符号标志(例如,数字总体上为正数还是负数),并更改构造函数,以确保数字始终为正数。
答案 1 :(得分:0)
您将数字数组存储为整数的相反顺序。现在在toString中,只需将每个数字以相反的顺序转换为字符,然后将其推入字符串结果即可。这是我的解决方法
string LargeInteger::tostring()
{
string intValue;
//intValue = ??
for (int index = numDigits-1; index >= 0; index--)
{
intValue.push_back(digits[index]+'0');
}
return intValue;
}