Files
BH-int2048-2023/README.md
2023-10-24 12:19:00 +08:00

108 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# int2048
高精度计算是一种程序设计的算法。由于中央处理器的字长限制,如 32 位 CPU 中一个整数最大只能取值 4,294,967,295。因此在进行更大范围的数值计算中往往要采取模拟手段。通常通过分离字符的方法通过数字数组进行输入、通过数组倒序输出、通过模拟竖式计算进行计算。一般而言主要模拟的是按位运算可以用不同的进位制达成不同的目的。
本次作业要求用 C++ 实现整数的高精度加减乘除。
### 实现要求
要求实现一个 C++ 的大整数类,命名为 `int2048`
接口已在 `int2048.h` 中给出,你需要新建一个 `int2048.cpp` 文件,在其中实现给定的接口。
当然,你也可以在**兼容当前所有接口**的基础之上,自己添加新的接口或修改原有接口(例如实现 `swap` 函数、右值构造函数)。
相应的实现应该在 `int2048.cpp` 中完成,不要在 `int2048.h` 中实现。在 OJ 提交中,需要将 `int2048.cpp` 中的实现复制到 `int2048.h` 之中,再进行提交。
#### 一些特殊要求
**你不需要考虑除数或模数为 0 的情况。在该情况下,程序的行为属于未定义行为。我们保证测试点中不会出现这样的数据。**
在我们的大整数类的实现中,对于除法操作 `x / y` ,其结果总是向下取整(即类似 python 中整除操作的表现):
```python
# 这是一段 python 代码
print(10 // 3, -10 // 3, 10 // -3, -10 // -3)
# 输出 3 -4 -4 3
# 因为 -10 / -3 = 3.333... 向下取整即为 3
# 而 10 / -3 = -3.333... 向下取整即为 -4
```
需要注意的是C++ 中,[有符号整数的除法](https://en.cppreference.com/w/cpp/language/operator_arithmetic)是向 0 取整。
```C++
// 这是一段 C++ 代码
std::cout
<< 10 / 3 << ' '
<< 10 / -3 << ' '
<< -10 / 3 << ' '
<< -10 / -3 << '\n';
// 输出 3 -3 -3 3
// 因为 -10 / -3 = 3.333 向 0 取整即为 3
// 而 10 / -3 = -3.333... 向 0 取整即为 -3
```
而对于取模操作 `x % y` ,其被定义为 `x % y = x - (x / y) * y` 。
### 评分标准
总分共占比 6\%
其中
- Integer 占比 100\%
- code review 若码风较差将酌情扣分
#### B 班
- 构造函数以及关系运算符 10\%
- 无符号高精度加减法 10\%
- 有符号高精度加减法 10\%
- 高精度乘法 10\%
- 高精度除法 15\%
- 压位高精度加、减、乘法 30\%
- 压位高精度除法 15\%
- BONUS压位快速高精度除法分治乘法 1\%
- BONUS压位快速高精度除法二分加速试商 4\%
#### A 班
- 构造函数以及关系运算符 10\%
- 无符号高精度加减法 5\%
- 有符号高精度加减法 10\%
- 高精度乘法 10\%
- 高精度除法 10\%
- 压位高精度加、减、乘法 20\%
- 压位高精度除法(二分加速试商) 15\%
- 压位快速高精度乘法(快速傅立叶变换) 20\%
- BONUS压位快速高精度除法分治除法/牛顿迭代法) 5\%
PSBONUS 部分对代码性能也有要求,需要通过对应的测试数据点才能得到分数。且 BONUS 上限为 5\%,超过不溢出。
如果你写了 BONUS 的除法并且通过了对应的测试点,那么你将不需要实现二分加速试商除法。
对于 A 班同学,需要特别注意的是,你的 int2048 将会在之后的大作业 python 解释器中被使用。请务必保证你的代码有足够的健壮性,能够应对各种极端情况。
### 截止时间
#### B 班
第 11 周周一11 月 20 日) 18:00
#### A 班
第 9 周周一11 月 6 日) 18:00
### 数据范围
参考具体题目。
**所有测试点时限均设置为 std 耗时的 2.5 倍以上。**
### 参考资料
[OI Wiki-高精度计算](https://oi-wiki.org/math/bignum/)
[高精度基础算法](https://baobaobear.github.io/post/20210228-bigint1/)
[分治除法以及相关算法](https://baobaobear.github.io/post/20210320-bigint3/)