gpt4 book ai didi

c++ - 在 C++ 中处理任意长度的整数

转载 作者:行者123 更新时间:2023-12-02 00:44:21 27 4
gpt4 key购买 nike

有人能告诉我一个很好的 C++ 库来处理(执行操作等......)任意大的数字(它也可以是一个处理任意精度浮点数的库,但处理整数更重要)?

请仅引用您使用过的库,并告诉我您是如何设法设置和选择它的,也许是一个非常简约的示例或其他东西(基本上,如果提到的库缺乏良好的文档,请提供您自己的一些输入)。

作为记录,我在 x64 机器上使用 Windows 7,CodeBlocks 作为我的 IDE,最新的 MinGW 作为编译器。

我试过的图书馆:

  • vlint(操作不够,但对小东西工作正常)
  • bigint(易于设置,编译错误,文档不多(可能从中衍生错误))
  • ttmath(看起来很有希望,编译了一些大的示例程序,并且由于编译错误而进行了一些修复,由于几乎没有文档而无法理解语法)
  • gmp(甚至无法设置)

  • 附言删除了“问题的咆哮部分”,它基本上解释了为什么我要问一些在 Stackoverflow 上被问过很多次的东西,所以人们会读到最后。

    --> 更新

    所以我选择了一个答案,它不是我最初问题的直接答案,但对我解决这个问题有很大帮助,我将发布我的一些发现来帮助其他像我这样的 C++ 新手开始使用非常大的数字而不会挣扎像我在一个简单的分步微指南中所做的那样的日子里的图书馆。

    我使用的是的东西(记住这一点以遵循指南):
  • Windows 7 Ultimate x64
  • Amd k10 x64 (有些库无法使用它,有些库的行为会有所不同,有些是针对 amd k10 定制的,因此这不仅可以帮助您使用我使用的库,还可能与其他人)
  • Code::Blocks 10.05 不含MinGW的版本,文件名“codeblocks-10.05-setup.exe”(安装在C:\Program Files (x86)\CodeBlocks)
  • MinGW 封装 (binutils-2.15.91-20040904-1.tar.gz gcc-core-3.4.2-20040916-1.tar.gz gcc-g29-20-30 1.tar.gz mingw-runtime-3.11.tar.gz w32api-3.8.tar.gz) 解压到 C:\MinGW
  • TTMath 0.9.2 文件名 “ttmath-0.9.2-src.tar.gz” 解压后将文件夹“ttmath”复制到文件夹“C:\CPPLibs”(即文件夹我把我的 C++ 库放入)

  • 如何设置所有
  • 转到代码:块>设置>编译器和调试器(我的编译器在这里被自动检测到。如果你没有发生这种情况,在“选定的编译器”上选择“GNU GCC编译器”并点击“设置为默认值”,然后在“编译器安装目录”上的“工具链可执行文件”上,您可以选择编译器的安装目录或尝试自动检测”,然后在“C++编译器”上排序,选择或写入“mingw32-g++.exe” “. 如果您遇到这种情况 只需执行此操作,在“Selected Compiler”上选择“GNU GCC Compiler”并单击“Set as Default”)。
  • 在不离开“代码:块>设置>编译器和调试器”的情况下,将上述内容整理好,转到“搜索目录”,然后“编译器”单击“添加”并选择存储库的文件夹或把你的“ttmath”文件夹(在我的例子中是C:\CPPLibs)然后转到“链接器”并做同样的事情。
  • 要开始使用“ttmath”库进行编码,您必须将这一行#include <ttmath/ttmath.h>放在主函数之前(注意:如果您使用的是 64 位系统,如果您不这样做,您将收到很多错误没有把这条线#define TTMATH_DONT_USE_WCHAR放在这条线#include <ttmath/ttmath.h>之前,我一直在努力解决这个废话,直到我找到了其他也在努力的人找到并发布在网上的修复程序并且它起作用了对我来说)ps我认为它仅适用于 64 位系统,但如果您确实因为包含“ttmath.h”头文件而出错,那很可能是因为这个原因。
  • 声明具有大整数值的变量必须这样做:ttmath::UInt<n> a,b,c;其中“a,b,c”是您的变量,“n”是您可以使用的数字的大小对于 32 位系统,以“2^(32*n)-1”的形式存储在变量中,对于 64 位系统,以“2^(64*n)-1”的形式存储
  • 为变量赋值 如果你这样做 a = 333;(代替 333 的数字大于 c++ 上的“long int”标准数据类型)它不会编译,因为赋值对于这样的变量,与您之前指定的大小无关,整数可以与 C++ 上的“long int”标准数据类型一样大(我自己想到了这个,很难),即使您使用较小的值,它编译没问题,然后你运行你的程序,它试图向这个变量写入一个比提到的“long int”标准数据类型可以处理的数字更大的数字,那么你的数学就会出错注意:要以正确的方式为变量赋值,您必须像这样分配a = "333";(是的,我知道您以这种方式将其视为字符串,但它只会执行操作很好,没有任何问题,如果你决定“cout”变量,它会永远不要像使用标准整数数据类型一样得到指数或科学记数法结果,而无需加上一些“额外语句”来显示恰到好处的数字)

  • 附言使用这个简单的规则来处理整数和这个库,我在 15 到 20 秒内用一个简单的程序(大约需要 3 分钟来编码)计算了第 100.000 个数字的斐波那契数,这个数字占用了 3 页,所以除了实用之外库一旦你知道它是如何工作的(你之前几乎没有任何帮助,ttmath 网站的一些样本非常具有误导性,但现在你确实有一些帮助)它似乎也非常有效,我确认第 100.000 个数字是可能是对的,因为我将大小(“n”)从 10000 增加到 50000,并且数字保留了大小,并且初始和最终数字相同。这是我使用的源代码,我使用了一个非常大的整数大小只是为了测试,我实际上并没有费心去看看程序会在什么长度上开始做错事,但我知道长度可达第 10.000 个斐波那契数不会超过我定义的长度,因为在此之前我使程序“cout”了每个结果,直到它达到第 10.000 个并且它一直在增长。在暂停程序之前,我还检查了序列的第一个数字,我看到“数字增长”并确认了序列的第一个斐波那契数字,它们是正确的。 注意:这个源代码只会显示你想知道的斐波那契数列的数字,如果你取消注释行,它只会显示“增长”的数字。
    #define TTMATH_DONT_USE_WCHAR
    #include <ttmath/ttmath.h>
    #include <iostream>

    using namespace std;
    int main () {

    int fibonaccinumber;
    cin >> fibonaccinumber;
    cin.ignore();

    ttmath::UInt<10000> fibonacci1,fibonacci2,fibonacci3;
    fibonacci1 = 1;
    fibonacci2 = 1;
    //cout << "1. " << fibonacci1 << "\n2. " << fibonacci2 << "\n";

    for(int i=3;i<=fibonaccinumber;i++)
    {fibonacci3 = fibonacci1 + fibonacci2;
    // cout << i << ". " << fibonacci3 << "\n";
    fibonacci1=fibonacci2;
    fibonacci2=fibonacci3;}

    cout << "the " << fibonaccinumber << "th fibonacci number is " << fibonacci2;

    string endprog;
    getline(cin,endprog);
    return 0;}

    我还没有修改这个图书馆的任意精度浮点数,但是当我这样做时,如果我看到人们对它感兴趣,我将继续扩展本指南,感谢所有评论和答案。

    最佳答案

    官方网站(http://www.ttmath.org/)有samples使用整数( ttmath::Int<2> a,b,c; )和浮点数( ttmath::Big<1,2> a,b,c; )。把这些当作高精度处理 int/float没有成员,一切都应该没问题。如果错误仍然存​​在,您能否发布完整的错误消息以及出错的代码行?

    关于c++ - 在 C++ 中处理任意长度的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8146938/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com