当我输入非常长的字符串以获取子字符串时,C++ Abort() 被调用

C++ Abort() has been called when I input extremely long string to get substring

https://www.hackerrank.com/challenges/sam-and-substrings/problem

这是我正在处理的问题,我遇到了问题。

这是我的代码

#include <string>
#include <iostream>
#include <vector>
double const modulo = 1000000007;

int main()
{
    std::string n("");
    std::cin >> n;
    long sum(0);
    std::vector<std::string> newlyAddedSubstring;

    for (auto i : n)
    {
        for (auto &j : newlyAddedSubstring)
        {
            j += i;
            long d = std::fmod(std::stod(j), modulo);
            sum = std::fmod(sum + d, modulo);
        }
        newlyAddedSubstring.push_back(std::string(1, i)); 
        newlyAddedSubstring.back();
        sum = std::fmod(sum + (i - '0'), modulo);
    }
    std::cout << sum << std::endl;
}

这是输入的一部分,输入的实际长度为 1003 630078954945407486971302572117011329116721271139829179349572383637541443562605787816061110360853600744212572072073871985233228681677019488795915592613136558538697419369158961413804139004860949683711756764106408843746324318507090...

在大约 327 次重复之前没有问题(即 newlyAddedSubstring 的大小约为 327)但是在

时出现问题
long d = std::fmod(std::stod(j), modulo);

如有任何意见或反馈,我们将不胜感激!!

std::stod 如果它从字符串中解析的值超出 double 可以容纳的值范围,则抛出异常 std::out_of_range

典型的 double 实现可以容纳的最大值大约为 300 位长。你的数字比那个大。

因此抛出异常,因为您没有捕获它 std::terminate 被调用,默认调用 std::abort,终止程序。

您不能在 double 中存储如此大的数字。您可以尝试 std::stold,它会尝试将数字解析为 long double 可能 大于 double 并且 可能能保住你的价值

此外,一般来说,浮点值不能准确地表示整数。因此,像您所做的那样对 doublelong double 进行模运算是毫无意义的。它不会给出准确的结果,对于非常大的值,它基本上会生成随机值。

如果你想对这么大的整数进行精确取模,你需要一个任意大小的整数库,或者你需要自己实现取模运算。