操作符的算法重载-用于自定义整数类

C++ Algorithmic overload for operator- for a custom integer class

本文关键字:自定义 整数 用于 算法 重载 操作符      更新时间:2023-10-16

我在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的整数,每个单元格代表无限中的另一个数字。单元格按照实际意义

向后排序。

意味着当我调用。tostring()给一个具有{5,3,9,2}向量的Unlimited时,

我将得到"2935"作为返回值。

添加两个unlimited的工作原理如下:将一个向量的所有细胞与另一个向量{a[0] + b[0], a[1] + b[1], ...}相加,以此类推。然后从0到size()遍历新向量,用以下方式设置每个单元格

vector[i+1] += vector[i] / 10;
vector[i] %= 10;

所以这有点工作(除了vector[i+1]=X的事情,因为你需要分配进一步的空间,如果单元格还没有重新分配。

这就是运算符+的思想

现在,当我们讨论运算符时,这是一个完整的差分算法,我似乎无法掌握它

不是因为负数,我相信如果我有算法的底数,我可以用它来算出一些东西。

如果有人能想出办法,哪怕只是一条线索,我都会很感激。

你可以做同样的方式你做加法:只需计算a[i]-b[i],然后'进位'值相同的方式你做加法:

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

只要您处理isPositiveoperator+工作,只需将isPositive反转为-操作符的右侧,并通过呼叫+让它完成工作。

规范的减法算法使用"借位"而不是加法算法中的"进位"。例如,2935-1369可以通过

完成
  • 5-9是负的,所以需要从2935中的"3"借一个1。这给你15-9,或6,加上2920-1360。
  • 2-6是负的,所以需要从2920中的"9"中借一个1。这给你12-6,或者6(现在乘以10),加上2800-1300。
  • 8-3=5,所以没问题。
  • 2-1=1,所以还是没有问题。
  • 结果为1566。

处理2935-2936是一个不同颜色的野兽。由于这是一个家庭作业(或看起来是一个家庭作业),我将把它留给你。