新数据类型,最多可包含100位数字

时间:2010-06-18 11:54:10

标签: c++

注意:这是一个面试问题,目前可能没有实际用例

问题是设计一个可以存储非常大的数字的类,说每个数字可以有100个数字。这个新类是一个像int这样的数据类型。

您要编写的构造函数,重载和其他函数有哪些不同类型。

如何进一步扩展以支持非常大的浮点数。

如何将其提供给其他人,以便他们可以使用自己的附加功能重用相同的组件。

我的回答包括两种方法 1.使用整数数组来存储每个10位数 2.使用字符串本身存储数字并对单个数字执行操作。

最好的方法是什么?

4 个答案:

答案 0 :(得分:8)

好问题:)

首先,使用字符串表示法并不专业。您可以更高效地在机器的单词级别进行数学运算。特别是如果你打算使用2号基地。

  

有哪些不同的类型   构造函数,重载等   你会写的函数。

您需要一组构造函数,如默认构造函数,复制构造函数,本机整数类型构造。最后一部分实际上是C ++中的棘手部分,在C ++中混合有符号/无符号算法并不像看起来那么简单。您可以safeint (used by Microsoft)的创作者从此视频中受益。此外,您可能需要从原始内存(字节块)构造您的bignum。如果你的bignum是动态的,那么就需要一个析构函数,否则实现它是微不足道的。

输入/输出标准设施是此类库的必备条件,以便于使用它。提供一种接受流行基地数字的方式也是一个优点。对于操作,您的类型应该像简单的本机类型一样。这意味着您需要重载几乎所有可能重载的运算符:

Arithmetic operators
Comparison operators/Relational operators
Logical operators
Bitwise operators
Compound-assignment operators
etc..

图书馆的内容是一个开放式问题。

最重要的是要记住,C ++有一些关于有符号和无符号数之间转换的规则。必须小心!

  

如何进一步扩展到   支持真正的大浮点   号。

大花车并不那么容易。 基本上,您选择要使用的基数。科学地表示数字意味着具有基数和指数部分。事实上哪些是整数。

  

如何将此提供给其他人   他们可以重用相同的组件   与他们自己的额外   功能。

尝试使其非侵入性。即,当我关闭int并将其替换为my_bigint时,它应该工作typedef fing应足以在您的类型和本机类型之间切换。让其他人在类型之上编写函数,使其成为黑盒子。我在使用库时更喜欢标题,所以我只会编写库标题。

  

我的回答包括两种方法1。   使用整数数组来存储每一个   说10位数2.使用字符串本身   存储号码并执行   对个别号码的操作。

字符串不太合适。你需要的是在大多数情况下选择base 2 ** n作为你的基础。有些图书馆使用其他基础,但我认为这不是一个好主意,MAPM就是其中之一。

答案 1 :(得分:4)

最好的方法是建议他们使用现有的,经过试验和测试的C ++包装器,用于像GMP这样的bignum库。

答案 2 :(得分:3)

请参阅维基百科有关Arbitrary-precision arithmetic的文章。

答案 3 :(得分:0)

我自己实现了一个bigint类来解决代码堵塞问题。我使用无符号数组来存储值,但您需要分别保持位数。我是根据需要实现的,

#define BIG_INT_SIZE 100

class BigInt
{
    friend ostream& operator<< (ostream& out, const BigInt& arg);
    friend istream& operator>> (istream& inp,       BigInt& arg);

    private:
            unsigned num[BIG_INT_SIZE+1];
            unsigned digits;
            bool     sign; // true for -ve

    public:
            BigInt(const char* = NULL) throw();
            BigInt(const BigInt&) throw();
            ~BigInt() throw();

            // ASSIGNMENT OPERATORS
            BigInt& operator=  (const BigInt& arg) throw();
            BigInt& operator=  (const    int& arg) throw();
            BigInt& operator=  (const   char* arg) throw();

            // ARITHMETIC OPERATORS
            BigInt  operator+  (const BigInt& arg) throw();
            BigInt  operator+= (const BigInt& arg) throw();
            BigInt  operator+  (const    int& arg) throw();
            BigInt  operator+= (const    int& arg) throw();

            BigInt  operator-  (const BigInt& arg) throw();
            BigInt  operator-= (const BigInt& arg) throw();
            BigInt  operator-  (const    int& arg) throw();
            BigInt  operator-= (const    int& arg) throw();

            BigInt  operator*  (const BigInt& arg) throw();
            BigInt  operator*= (const BigInt& arg) throw();
            BigInt  operator*  (const    int& arg) throw();
            BigInt  operator*= (const    int& arg) throw();

            BigInt  operator/  (const BigInt& arg) throw();
            BigInt  operator/= (const BigInt& arg) throw();
            BigInt  operator/  (const    int& arg) throw();
            BigInt  operator/= (const    int& arg) throw();

            BigInt  operator%  (const BigInt& arg) throw();
            BigInt  operator%= (const BigInt& arg) throw();
            BigInt  operator%  (const    int& arg) throw();
            BigInt  operator%= (const    int& arg) throw();

            // UNARY OPERATORS
            void operator++ ()    throw();
            void operator++ (int) throw();
            void operator-- ()    throw();
            void operator-- (int) throw();

            // COMPARISON OPERATORS
            bool   operator>  (const BigInt& arg) throw();
            bool   operator>= (const BigInt& arg) throw();
            bool   operator<  (const BigInt& arg) throw();
            bool   operator<= (const BigInt& arg) throw();
            bool   operator== (const BigInt& arg) throw();
            bool   operator!= (const BigInt& arg) throw();

            // DISPLAY & ORDERING
            void big_int_order() throw();
            void big_int_print() throw();
};

希望这可能会有所帮助。我将在我的博客中发布完整的实现。我会在完成后更新。