【问题标题】:Large numbers from string to int in c++c++中从字符串到整数的大数
【发布时间】:2015-04-17 03:02:12
【问题描述】:

在我问这个问题之前我做了一些搜索。我尝试使用unsigned int,然后使用strtoul 将字符串转换为unsigned int。 甚至像

这样的简单代码
 unsigned int num = 99999999999999999999999999999999999999999999999999999999999999999999999999999999

此代码仍然无法正常工作。我希望能够做这样的事情:

     unsigned int num = 99999999999999999999999999999999999999999999999999999999999999999999999999999999;
     unsigned int num2 = 1;
     unsigned int ans = num + num2;

我希望能够做这样的事情:

 string num1 = "99999999999999999999999999999999999999999999999999999999999999999999999999999999;"
 string num2 = "1"
 string conv_ans;

 unsigned int conv1 = strtoul(num1); 
 unsigned int conv2 = strtoul(num2); 
 unsigned int ans = conv1 + conv2;

 conv_ans = ans;

谢谢!

【问题讨论】:

  • 所以您正在寻找 C++ 中的大整数库? unsigned int 可以容纳的最高值通常是 4294967295 或 18446744073709551615,因此无法将 9999999999999999999999999999999999999999999... 存储在 unsigned int 中。
  • 无论你的代码体操如何,int 永远不会*存储那么大的数字。 msdn.microsoft.com/en-us/library/s3f49ktz.aspx
  • @user4799188:即使是 64 位 CPU 也没有足够大的寄存器来在单个操作中处理如此大的数字,因此数学运算必须由软件从几个较小的步骤合成,并且相当大慢点。大多数语言的主要算术支持仅限于其硬件可以全速执行的操作,但 C++ 有库(例如GMP)允许您使用任意大的数字。 (关于 Python,我可以说的几件好事之一:它开箱即用地支持这一点,但它在所有事情上都很慢,为什么要关心这个......)
  • 或者,使用double(或者甚至long double,如果你的编译器提供它) - 尽管在最低有效数字中会有一些舍入错误。
  • @element11: s/16 bits/often 32 bits/

标签: c++ string int long-integer


【解决方案1】:

我希望能够做这样的事情

你不能。

unsigned int 不能存储大于 std::numeric_limits<unsigned int>::max()。通常约为 40 亿。

要存储和管理任意大小的整数,例如银河系中的原子数(大约是您的数字),您需要使用“big int”库,例如GMP

【讨论】:

    【解决方案2】:

    正如@Drew 的回答中提到的,没有 C++ 内置类型可以存储任意大小的整数。 Boost 附带一个快速且易于使用的多精度库,它被称为Boost.Multiprecision。它是reasonably fast,编写使用它的代码轻而易举(不需要预编译的头文件或其他共享库,只需-I /path/to/boost)。例如,计算阶乘(1000)(这是一个非常大的数字)看起来像

    #include <boost/multiprecision/cpp_int.hpp>
    #include <iostream>
    
    int main()
    {
       using namespace boost::multiprecision;
    
       cpp_int u = 1; // multi-precision integer
       for(int i = 1; i < 1000; ++i) // compute 1000!
          u *= i;
    
       std::cout << u << std::endl; // prints 1000!
    }
    

    Boost.Multiprecision 的一个优点是它与 C++ 流库的集成非常好,您基本上可以将其用作内置类型。该库还支持浮点数、有理数等(请参阅文档)。

    此外,Boost 是最“标准化”的 C++ 库之一(Boost 的许多特性最终都出现在 C++11 中),并且使用率很高,因此您可以尝试一下。

    【讨论】:

    • 哇,这是非常无缝的代码。是时候学习一个新的 boost 库了。
    • string s="12577777768457677219765765712433333434",我可以用boost库转换成整数吗(就像我们使用stoi一样)?
    猜你喜欢
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2017-02-05
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    相关资源
    最近更新 更多