Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用2000个或更多数字表示整数_C++_Integer - Fatal编程技术网

C++ 用2000个或更多数字表示整数

C++ 用2000个或更多数字表示整数,c++,integer,C++,Integer,我想写一个程序,它可以计算超过2000或20000位的整数(对于Pi的小数)。我想在C++中做,没有任何库!(没有大整数,boost,…)。有人能建议一种方法吗?以下是我的想法: 使用常量字符*,用于保存整数的数字 表示数字,如 显而易见的答案是这样的: class integer { bool negative; std::vector<std::uint64_t> data; }; 缩减(模2**64)自动发生,进位只能为零或一。剩下的就是检测进位,这很简

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

  • 使用
    常量字符*
    ,用于保存整数的数字

  • 表示数字,如



显而易见的答案是这样的:

class integer {
    bool negative;
    std::vector<std::uint64_t> data;
};
缩减(模2**64)自动发生,进位只能为零或一。剩下的就是检测进位,这很简单:

bool next_carry = false;
if(x += y < y) next_carry = true;
if(prev_carry && !++x) next_carry = true;
bool next\u carry=false;
如果(x+=y
类似地,可以使用借用来实现减法。
请注意,任何接近libgmp性能的地方都是。。。不太可能。

长整数通常由数字序列表示(请参阅)。为方便起见,请使用约定:[0]是最低的数字,[n-1]是最高的数字。一般情况下,对于某个基数值,您的数字等于总和(A[i]*base^i)

基数的最简单值是10,但它不是有效的。如果您想经常向用户打印答案,最好使用10的幂作为基数。例如,您可以使用base=10^9并将所有数字存储为int32类型。若你们想要最大的速度,那个么最好使用两垒的力量。例如,base=2^32是32位编译器的最佳基础(不过,您需要汇编程序才能使其以最佳方式工作)

表示负整数有两种方法,第一种是将整数存储为符号+数字序列。在这种情况下,你必须自己处理所有带有不同标志的情况。另一个选择是使用。它可以用于两个碱基的幂和十个碱基的幂

由于序列的长度可能不同,您最好将数字序列存储在中。在这种情况下,不要忘记拆下。另一种解决方案是始终存储固定数量的数字(固定大小数组)

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


p.S.或者,每个整数(有界长度)都可以通过一组不同的素数模块的提醒来表示,这要归功于。这种表示只支持有限的一组操作,如果要打印它,需要进行非平凡的转换。

我很想为每个数字使用
uint8\t
。内存不是特别友好,但会使算术运算易于处理。或者,考虑更难的二进制编码十进制(BCD)表示法。整数对PI不是有用的。为什么你不想要LIB?2)因为我在练习C++和我的数学:我没有说你不应该。但是如果你想问别人你应该怎么做,你不妨看看过去是怎么做的,因为这是人们在你自己的图书馆里给你的建议。这是一门数学上很难的课程,你也有编程问题。编写一个有竞争力的bignum库可能需要几十年的时间。在我看来,使用2的补码形式更为明显。您建议使用2^64作为基数。那么,你能在没有汇编的情况下实现进位乘法吗?为了适应像pi这样的数字,这还需要一个数据成员来规定小数点的位置。@stgatilov是-你把它们当作两个32位的数字,并进行一次小的学校乘法。你能不能演示一下如何重载+和=运算符?不,bignum算术运算并不简单。他们正在使用非常困难但高效的算法(比高中的算法要好得多)。Bignum算法真的很难@事实上,最快的bignum库用于乘法等。然而,简单的操作很容易实现,并且可以很好地工作。这对于OP来说应该足够了。此外,我非常怀疑内置的BigInt是否在Java中使用了FFT。
  a           b
+ x           y
------------------
 (a+x+carry) (b+y reduced to one digit length)
bool next_carry = false;
if(x += y < y) next_carry = true;
if(prev_carry && !++x) next_carry = true;