【问题标题】:Incrementing big numbers (nearly 100.000 digits) in C++在 C++ 中递增大数字(近 100.000 位)
【发布时间】:2013-10-24 03:24:33
【问题描述】:

如何在 C++ 中存储大量近 100000 位数字?..

我尝试过使用long long intlong double int..没有什么对我有用..

还有其他方法可以存储这么大的数字吗?

我希望找到比给定大数更大的最小回文数。

【问题讨论】:

  • 试试 GMP 库。
  • 您可以将其存储在int[] 中作为幅度
  • 存储后你会做什么?如果你告诉我们会很有帮助
  • @mr5 我希望找到比给定的巨大数字更大的最小回文...

标签: c++


【解决方案1】:

在 cmets 部分进一步澄清后:

是的,您可以在 C++ 中将您的数字表示为 std::string。

Here 你可以找到递增表示为字符串的数字的代码:

#include <string>
#include <iostream>
#include <ostream>

void increment_numerical_string(std::string& s)
{
    std::string::reverse_iterator iter = s.rbegin(), end = s.rend();
    int carry = 1;
    while (carry && iter != end)
    {
        int value = (*iter - '0') + carry;
        carry = (value / 10);
        *iter = '0' + (value % 10);
        ++iter;
    }
    if (carry)
        s.insert(0, "1");
}

int main()
{
    std::string big_number = "123456789012345678901234567899";
    std::cout << "before increment: " << big_number << "\n";
    increment_numerical_string(big_number);
    std::cout << "after increment:  " << big_number << "\n";
}

您可以在循环中使用它来增加您的大数字和check if the resulting string is a palindrome

if( equal(s.begin(), s.begin() + s.size()/2, s.rbegin()) )
    std::cout << "is a palindrome.\n";
else
    std::cout << "is NOT a palindrome.\n";

编辑

我并不认为这是解决问题的有效且正确的方法。它只是大数字的一种表示和递增方法。

【讨论】:

  • 我在考虑这个解决方案,这就是为什么我首先在​​评论中问它的原因。你让我在这里:(
【解决方案2】:

您正在寻找“bignum”或“biginteger”库。

OpenSSL 提供了这样一个库,但有时很难使用。从 API 的角度来看,Matt McCutchen's library 似乎更友好。

【讨论】:

    【解决方案3】:

    GNU MP Bignum Library 是一个很好的解决方案。它主要是一个 C 库,但具有有效的 C++ 包装器(在需要时可以轻松访问底层 C 结构)。它支持整数、有理数和浮点数。

    【讨论】:

      【解决方案4】:

      如果您感到非常勇敢,您可以将长数字实现为单个整数的链表。因此,您可以对这些数字进行递增或加减乘除,最好创建一个类并使用运算符重载。

      【讨论】:

      • 我确实说过他/她是否感到非常勇敢。我不知道你为什么要减去一个我。先生/女士,我咬你的拇指。
      • 因为将 bigint 存储为 链表 可能是效率最低的解决方案之一。访问 bigint 时,您需要对内部数据数组进行随机/索引访问(没有它也可以工作,但它肯定会让您的生活更轻松)。这意味着双端队列或向量。除此之外,链表还有很大的内存开销,因为每个数字需要一个或两个指针,在 64 位平台上每个数字最多需要 16 个额外字节。甚至不需要使用 list ,因为在算术运算中,您永远不会删除中间的数字。这就是你得到 -1 的原因。
      • 我同意你所说的一切。但是,无论是否有效,这仍然是一个有效的建议。
      猜你喜欢
      • 2015-03-18
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 2021-06-21
      • 1970-01-01
      • 2022-11-19
      相关资源
      最近更新 更多