用2000或更多数字表示整数

时间:2015-07-23 10:39:18

标签: c++ integer

我想编写一个程序,它可以计算出超过2000或20000位数的整数(对于Pi的小数)。我想用C ++做,没有任何库! (没有大整数,提升,......)。任何人都可以建议一种方法吗?以下是我的想法:

  • 使用const char*来保存整数的数字;

  • 代表

  • 之类的数字
( (1 * 10 + x) * 10  + x )...

2 个答案:

答案 0 :(得分:4)

明显的答案是这样的:

class integer {
    bool negative;
    std::vector<std::uint64_t> data;
};

其中数字表示为符号位和(无符号)基数2 ** 64值。

这意味着您的号码的绝对值是:

data [0] +(data [1]&lt;&lt; 64)+(data [2]&lt;&lt;&lt; 128)+ ....

或者,换句话说,您将数字表示为一个小端字符串,其字数与目标计算机可以合理使用的一样大。我选择64位整数,因为你可以通过这种方式最小化单个字操作的数量(在x64机器上)。

要实现Addition,您可以使用在小学中学到的概念:

  a           b
+ x           y
------------------
 (a+x+carry) (b+y reduced to one digit length)

减少(模2 ** 64)自动发生,并且进位只能是零或一。剩下的就是检测一个进位,这很简单:

bool next_carry = false;
if(x += y < y) next_carry = true;
if(prev_carry && !++x) next_carry = true;

可以使用借用来类似地实现减法。 请注意,要获得接近于libgmp是......不太可能。

答案 1 :(得分:2)

长整数通常由一系列数字表示(参见positional notation)。为方便起见,使用little endian约定: A [0] 是最低位, A [n-1] 是最高位数。一般情况下,对于某些 base 的值,您的数字等于 sum(A [i] * base ^ i)

base 的最简单值是十,但效率不高。如果您想经常向用户打印答案,最好使用10次幂作为 base 。例如,您可以使用 base = 10 ^ 9并将所有数字存储在int32类型中。如果你想要最大速度,那么最好使用两个幂的基础。例如,base = 2 ^ 32是32位编译器的最佳基础(但是,您需要进行汇编以使其以最佳方式工作)。

有两种表示负整数的方法,第一种是将整数存储为符号+数字序列。在这种情况下,您必须自己处理所有具有不同标志的案例。另一种选择是使用complement form。它既可用于二次幂,也可用于十次幂。

由于序列的长度可能不同,因此您最好在std::vector中存储数字序列。在这种情况下,请不要忘记删除leading zeroes。另一种解决方案是始终存储固定数量的数字(固定大小的数组)。

操作以非常简单的方式实现:就像你在学校里做的那样=)

P.S。或者,由于CRT,每个整数(有界长度)可以通过其对一组不同主要模块的提醒来表示。这样的表示仅支持有限的操作集,如果要打印它,则需要非常重要的转换。