运算符的C ++算法重载 - 用于自定义整数类

时间:2015-05-21 16:31:22

标签: c++ algorithm math vector

我在使用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之外,因为如果单元格尚未重新分配,则需要分配更多空间。

所以这是运营商+想法。

现在,当我们谈论运算符时,这是一个完全不同的算法,我似乎无法掌握它。

与其说负面数字并不是很多,如果我有算法的基础,我相信我可以用它来解决问题。

如果有人管理这个数字,即使只是一个线索,我也会感激不尽。

3 个答案:

答案 0 :(得分:0)

只要您处理isPositive operator+工作,只需将[{1}}操作员右侧的isPositive转换为-,然后拨打{{1}让它完成工作。

答案 1 :(得分:0)

规范减法算法使用&#34;借用&#34;而不是&#34;携带&#34;出现在附加算法中。例如,2935-1369可以通过

完成
  • 5-9是否定的,所以你需要从&#34; 3&#34;在2935.这给你15-9,或6,再加上2920-1360。
  • 2-6是否定的,所以你需要从&#34; 9&#34;在2920.这给你12-6或6(现在乘以10),再加上2800-1300。
  • 8-3 = 5,所以没问题。
  • 2-1 = 1,所以再一次,没问题。
  • 结果是1566。

处理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,代码也非常相似。