当我输入非常长的字符串以获取子字符串时,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
并且 可能能保住你的价值
此外,一般来说,浮点值不能准确地表示整数。因此,像您所做的那样对 double
或 long double
进行模运算是毫无意义的。它不会给出准确的结果,对于非常大的值,它基本上会生成随机值。
如果你想对这么大的整数进行精确取模,你需要一个任意大小的整数库,或者你需要自己实现取模运算。
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
并且 可能能保住你的价值
此外,一般来说,浮点值不能准确地表示整数。因此,像您所做的那样对 double
或 long double
进行模运算是毫无意义的。它不会给出准确的结果,对于非常大的值,它基本上会生成随机值。
如果你想对这么大的整数进行精确取模,你需要一个任意大小的整数库,或者你需要自己实现取模运算。