处理大整数值的C ++编程赋值

时间:2014-03-10 19:39:33

标签: c++

因此,我必须为我的C ++类做的这项任务基本上是为了证明我们可以处理创建类和运算符重载。现在我们必须重载函数+,*,+ =,* =,==,!=,<,< =,>,> =,^的二进制函数(Hyperint是此赋值的类)我们必须构建一个构造函数:()和输入输出流,以及前缀/后缀。现在我为所有这些运算符重载构建了我的头文件:

class Hyperint
{
public:
Hyperint(void);
~Hyperint(void);


const Hyperint & operator+= (const Hyperint & right);
const Hyperint & operator*= (const Hyperint & right);
const Hyperint operator^ (long e) const;
const Hyperint &operator++ (int);
const Hyperint &operator-- (int);


friend const bool operator== (const Hyperint &left, const Hyperint &right);
friend const bool operator!= (const Hyperint &left, const Hyperint &right);
friend const bool operator< (const Hyperint &left, const Hyperint &right);
friend const bool operator<= (const Hyperint &left, const Hyperint &right);
friend const bool operator> (const Hyperint &left, const Hyperint &right);
friend const bool operator>= (const Hyperint &left, const Hyperint &right);
friend std::istream & operator >> (std::istream & is, Hyperint & hypint);
friend std::ostream & operator << (std::ostream & os, const Hyperint & hypint);



};

const Hyperint operator+ (const Hyperint & left, const Hyperint &right);
const Hyperint operator* (const Hyperint & left, const Hyperint &right);

现在我有几个设计问题。因为构造函数调用long类型,所以long类型只能处理因为long只能处理从:-2,147,483,647到2,147,483,647的整数,它明确表示我的教授要我们处理313 ^ 313的值不能保存(注意:我的老师特别是说构造函数必须接受长变量作为参数)。现在我的问题是如何计算一个大的值,我想的可能是将long转换为字符串并处理数字的方式,但我不确定这是否适合这种设计。或者我甚至想到以某种方式将数字存储成一个向量。我的问题基本上是你认为哪种设计格式最适合这种项目?就像我怎么能一起添加两个Hyperint号码?非常感谢,非常感谢任何帮助! OH和最后一个快速问题,我的老师也说我们需要“转换为bool”我不完全确定他的意思是什么?如果你有什么想法那就太棒了!再次感谢!

2 个答案:

答案 0 :(得分:5)

您的老师称之为Hyperint只是一个任意数量的十进制或二进制数字。您可以在数组或向量中存储任意数量的数字,然后对它们执行小学算术。

为了说明,请考虑以下multiplication operation

        23958233
            5830 ×
    ------------
        00000000 ( =      23,958,233 ×     0)
       71874699  ( =      23,958,233 ×    30)
     191665864   ( =      23,958,233 ×   800)
    119791165    ( =      23,958,233 × 5,000)
    ------------
    139676498390 ( = 139,676,498,390        )

所以你有两个操作数:23958233和5830.假设一个节点图形状像一个单链表(为了便于说明),每个操作数的十进制数字将存储在你的矢量中:

2 --> 3 --> 9 --> 5 --> 8 --> 2 --> 3 --> 3

5 --> 9 --> 8 --> 8

换句话说,向量中的每个元素都将存储一个十进制数字,每个向量将存储一个完整的数字。您将以类似的方式存储中间结果(每个中间结果一个向量),然后将它们全部加在一起,即校等风格。

请注意,这只是说明了一个单次乘法运算。为了将数字提升到一个幂,你必须重复这个乘法,无论功率多少倍。

答案 1 :(得分:1)

Bignumber库就是为了这个目的,它们通常将整数存储为字节数组或整数数组。它们可以代表任意大的“大整数”,有时也代表小数。我最喜欢的一个实现大数字算法的库是libtommath:http://libtom.org/?page=features&newsitems=5&whatfile=ltm

如果你有时间,看看那个人的其他文库,它的源代码非常好,干净,生产质量即使它是C,我通常也不喜欢C库。

虽然它是一个C库,你可以从中作弊,或者你可以在允许的情况下扭曲它。 libtommath中的“bn_”内容是指“BigNumber”。