2013-03-06 60 views
-2

我对SPOJ以下问题工作数据类型,c - 要很长的数字

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

据说数应包含atmost 500位,什么是一个合适的数据类型numberwith maximun 500 digits

+2

可能的重复[如何创建一个数据类型来保存200多位数字在C?](http://stackoverflow.com/questions/5436007/how-to-create-a-datatype-to-hold- 200-digit-long-numbers-in-c) – 2013-03-06 06:17:43

+0

是的,我使用了一个500字符的字符串,但是为了进行计算,当我们将该字符串转换为一个数字时,问题就到来了。 – Subbu 2013-03-06 06:18:37

+1

这可能不是一个有效的解决方案。但是,为什么不使用数组并且从最后一个(n-1)开始执行操作。在需要的地方使用临时变量(进位,借位等)。再次,这可能不是一个有效的解决方案。 – Gomu 2013-03-06 06:24:31

回答

1

使用GMP库多精度算术,你会被排序。

http://gmplib.org/

+0

金杰尔,谢谢你的建议! – Subbu 2013-03-06 06:45:20

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); 
0

有存储许多位在C一些没有内置的方式。该问题旨在让您通过其他方式进行算术运算(将数字始终保留为字符串,并一次处理少量的实际数字)。由于BigInteger,Java中的问题更容易实现(例如)。但是如果你想用c来完成,我会看看BigNum实现如何工作。这可能有助于作为参考:

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

0

对于每一个乘法,由第二个数字的每个数字相乘的第一个数字。将部分结果放在另一个的下方,从第二个数字的最后一位开始。每个部分结果应与相应的数字排列“

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

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

由于重点在于编写数字向下以10为底,并且由于输入以10为底,所以我建议使用10位基本派生数组 - Char s是研究长乘法的好候选者,但将基数扩展到100,1e4,1e6或1e9是有意义的。

基地100将适合uint8_t或字符,基地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 
}; 
0

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

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

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