c - 非常长的数据类型

时间:2013-03-06 06:12:56

标签: c types

我正在研究SPOJ的以下问题,

http://www.spoj.com/problems/ARITH/

据说这个数字应该包含最多500位,具有最大500位数的数字的适当数据类型是什么

5 个答案:

答案 0 :(得分:2)

没有内置数据类型来容纳500位数的整数。因此,您必须想出一种方法将它们存储在一个字节数组中。

http://gmplib.org/的作用中获取灵感。简而言之,您必须先将数字存储在某处:

struct Digit {
    size_t len;
    char   sign;
    char*  digits;
};

然后,您必须实现使用此类Digit

所需的所有功能
void digit_init(struct Digit* d);
void digit_set(struct Digit* d, const char* digits);
void digit_add(struct Digit* a, struct Digit* b, struct Digit* result);
void digit_mult(struct Digit* a, struct Digit* b, struct Digit* result);

答案 1 :(得分:1)

使用GMP库进行多精度算术,您将被排序。

http://gmplib.org/

答案 2 :(得分:0)

没有内置的方法可以将多个数字存储为c中的数字。这个问题旨在让你通过其他方式进行算术运算(将数字作为字符串保留整个时间并同时处理少量实际数字)。由于BigInteger,问题在Java(例如)中更容易实现。但是如果你想用c做,我会看看BigNum实现如何工作。这可能有助于作为参考:

http://www.algorithmist.com/index.php/BigNum

答案 3 :(得分:0)

  

对于每次乘法,将第一个数乘以第二个数的每个数字。将部分结果放在另一个之下,从第二个数字的最后一位数的乘积开始。每个部分结果应与相应的数字对齐。“

由于这种限制,没有实际的替代品   char bignum[MAX_DIGITS+1];

编辑 - 这是我最初的回应;如果不需要打印中间结果,它仍然有用。

由于重点在于数字在基数10下来,并且由于输入在基数10,我建议使用基数十个导数数组 - 字符是研究长乘法的一个很好的候选者,但将基数扩展到100,1e4,1e6或1e9将是有意义的。

Base 100适合uint8_t或char,base 10000适用于uint16_t(而16x16 ==> 32乘法即使在大多数嵌入式处理器上也可用);双打可以保持精确值高达2 ^ 53 -1,这会将每个被乘数实际限制为1e6。

使用例如base 1e8允许在(uint32_t)中存储8位数,并允许在(uint64_t)中逻辑存储乘法结果。它还允许轻松打印数字,而无需将基数2 bignum转换为十进制表示所需的长除法。

 struct big_int {
     uint32_t digits[MAX_DIGITS/8];
     unsigned int length;  //
     int sign;             // or possibly use int length and negative lengths
 };

答案 4 :(得分:0)

据我所知,没有这样的内置函数/类型来执行具有这种精度的算术。既不是C也不是C ++。也不是STL。也没有提升C ++。因为您要将其提交到SPOJ,所以您无法链接自定义库。据我所知,如果你坚持使用C,并且你在SPOJ上遇到问题,你只能编写自己的例程或复制和粘贴。

或者,尝试内置Big-Integer支持的Java / Python。

长话短说,没有优雅的方法来实现这一点,因为你要在SPOJ上提交它。