操作符的算法重载-用于自定义整数类
C++ Algorithmic overload for operator- for a custom integer class
我在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
,代码将非常相似。
只要您处理isPositive
为operator+
工作,只需将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是一个不同颜色的野兽。由于这是一个家庭作业(或看起来是一个家庭作业),我将把它留给你。
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- std::ranges::elements_view,用于自定义类似元组的数据
- 跟随整数索引列表的自定义类迭代器
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- C++十六进制整数的自定义 I/O 操纵器
- MySQL 和 Sparksee 数据库中的自定义大小整数
- 用整数填充自定义整数数组
- 在c++中使用整数排序(自定义使用std:: Sort)
- 自定义流操纵器,用于在任何基中流式传输整数
- 如何在C++中创建自定义整数序列
- 操作符的算法重载-用于自定义整数类