我在使用C ++练习时遇到了问题。 我应该创建一个可以容纳任何可能大小的类,即“仅限于机器的硬件”。 我们的想法是存储代表任意数字的数据。
我的概念是这样的:
class Unlimited
{
public:
Unlimited();
Unlimited(const string& value);
/* bunchload of operator overloading
* and helping functions */
private:
vector<int> numbersVector;
bool isPositive;
/* another bunchload of helping functions */
}
编辑:我在每个函数中也限制为4-5行,因此每个函数都必须在逻辑上与其他函数分开。
所以我要做的就是充分利用STL容器并有效地使用运算符。 我决定使用vector(over list)。 向量中的每个单元格都包含一个0到9的int,每个int代表Unlimited中的另一个数字。单元格从实际含义向后排序,
当我将.toString()调用到具有{5,3,9,2}向量的无限制时,意味着
我会以"2935"
作为返回值。
添加两个Unlimiteds的工作原理如下:
您将一个向量的所有单元格与另一个向量{a[0] + b[0], a[1] + b[1], ...}
相加,依此类推。
然后,您将新的向量从0转到size(),并按以下方式设置每个单元格
vector[i+1] += vector[i] / 10;
vector[i] %= 10;
所以这种方法有效(除了vector[i+1]=X
之外,因为如果单元格尚未重新分配,则需要分配更多空间。
所以这是运营商+想法。
现在,当我们谈论运算符时,这是一个完全不同的算法,我似乎无法掌握它。
与其说负面数字并不是很多,如果我有算法的基础,我相信我可以用它来解决问题。
如果有人管理这个数字,即使只是一个线索,我也会感激不尽。
答案 0 :(得分:0)
只要您处理isPositive
operator+
工作,只需将[{1}}操作员右侧的isPositive
转换为-
,然后拨打{{1}让它完成工作。
答案 1 :(得分:0)
规范减法算法使用&#34;借用&#34;而不是&#34;携带&#34;出现在附加算法中。例如,2935-1369可以通过
完成处理2935-2936是一种不同颜色的野兽。由于这是一项家庭作业(或似乎是一项),我将把它留给你。
答案 2 :(得分:0)
您可以像添加相同的方式执行此操作:只需计算a[i]-b[i]
,然后随身携带&#39;值的方式与此相同:
c[i+1] += c[i] / 10
c[i] %= 10
您只需要确保对于负值,根据适当的数学规则进行除法,而不是像计算机那样(即(-3)%10 = 7,并且(-3)/ 10 = -1)。最简单的方法是编写
c[i+1] +=(c[i]+10)/10 - 1
c[i] = (c[i]+10)%10
另一个非常有趣的想法是不使用数字0,1,...,9,但-5,-4,-3,...,4(仍然是基数10)。任何整数,无论是正数还是负数,都可以用这种方式表示,您不需要isPositive
字段。例如,17表示为{2 -3},即2 * 10 +( - 3)* 1,-9是{-1 1},即(-1)* 10 + 1 * 1。你将有一个更难的toString
方法,但你的加法和减法会更简单。您无需检查isPositive
,代码也非常相似。