代码之家  ›  专栏  ›  技术社区  ›  ckv

新的数据类型,其数字最多可为100位

c++
  •  2
  • ckv  · 技术社区  · 14 年前

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

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

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

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

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

    4 回复  |  直到 14 年前
        1
  •  4
  •   Will    14 年前
        2
  •  8
  •   Khaled Alshaya    14 年前

    好问题:)

    首先,使用字符串表示法并不专业。你可以更有效地在机器的文字层次上进行数学运算。尤其是如果你要用基数2。

    构造函数、重载和其他

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

    输入/输出标准设施是这样一个库易于使用的必要条件。提供一种方法来接受流行基数的数字也是一个加号。对于操作,您的类型的行为应该与简单的本机类型一样。这意味着您需要重载几乎所有可以重载的运算符:

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

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

    如何进一步扩展到 支持非常大的浮点

    大彩车没那么容易。

    怎么能把这个给别人呢 他们可以重用相同的组件 用他们自己的额外的 功能。

    尽量避免打扰。i、 e.当我采取 int 关掉,把它换成我的钥匙,然后它应该 ! typedef

    我的答案包括两种方法1。 使用整数数组存储 对单个数字的操作。

    弦不是很合适。你需要的是在大多数情况下选择基2**n作为你的基。有些图书馆使用其他的基础,但在我看来这不是一个好主意, MAPM

        3
  •  3
  •   oherrala    14 年前
        4
  •  0
  •   josh    14 年前

    我自己实现了一个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();
    };
    

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