欧拉项目#8答案是大以获得有效答案
Project Euler #8 Answer is to large to get valid answer
我已经查看了这里的结果,试图看看我的错误在哪里。我不是在寻找解决方案的答案,而是在暗示我忽略了导致错误答案的原因。话虽如此,让我们进入它。
我正在研究欧拉项目问题,目前在8号。我相信这个问题应该测试你对迭代和存储大数的了解。我试图将值存储为无符号 int、long long int 和字符串,但所有这些都给了我不同的错误答案。正如我之前提到的,我想知道是否有人可以指出我被忽视或研究不够彻底的正确方向。
我的代码:
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main()
{
vector<int> numberList = "I broke the number provided into individual one digit integers";
string sum;
string answer;
for(auto it = numberList.begin(); it != numberList.end(); it++)
{
auto it2 = next(it, 1);
auto it3 = next(it2, 1);
auto it4 = next(it3, 1);
auto it5 = next(it4, 1);
auto it6 = next(it5, 1);
auto it7 = next(it6, 1);
auto it8 = next(it7, 1);
auto it9 = next(it8, 1);
auto it10 = next(it9, 1);
auto it11 = next(it10, 1);
auto it12 = next(it11, 1);
auto it13 = next(it12, 1);
if(it12 == numberList.end())
{
break;
}
sum = to_string(*it * *it2 * *it3 * *it4 * *it5 * *it6 * *it7 * *it8 * *it9 * *it10 * *it11 * *it12 * *it13);
if(sum.compare(answer) > 0)
{
answer = sum;
}
}
cout << answer << endl;
}
我对这个解决方案的攻击计划是在每个循环中更新 13 个迭代器,我会使用这些值来多个并找到解决方案。我发现的问题是,对于导致溢出的 int,结果数字太大。然后我尝试了很长时间并且没有签名,但都导致了错误的答案。这个版本的解决方案我试图将其存储在一个字符串中,这也导致了错误的答案。重要的是要注意,我试图将这个解决方案保持在线性时间内。感谢您的帮助。
在标准架构(其中long long
长度为 64 位)上,您不需要std::string
此问题,因为您要乘以 13 位数字,因此结果将始终小于10^13
,这很容易适合long long
(2^63 ~ 10^19
)。
代码的问题在于您正在使用int
执行乘法,因此您在转换之前溢出:
sum = to_string(*it * *it2 * *it3 * *it4 * *it5 * *it6 * *it7 * *it8 * *it9 * *it10 * *it11 * *it12 * *it13);
这里*it
、*it2
、...都是int
的迭代器,所以你得到一个在转换to_string
之前溢出的int
域中的乘积。
您应该使用std::vector<long long>
来存储数字或将第一个数字转换为long long
:
sum = (long long) *it * *it2 * *it3 * *it4 * *it5 * *it6 * *it7 * *it8 * *it9 * *it10 * *it11 * *it12 * *it13;
sum
/answer
可以简单地long long
.
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 首要问题的答案让值班员搞错了
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 自定义先决条件对移动分配运算符有效吗
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 使用 bfs 解决连接组件问题时得到错误的答案
- 如何解决数独问题,以便通过交换任何两个相邻的子网格,我仍然得到有效的答案?
- 我如何让我的部分代码循环并重复一个问题,直到答案是有效的输入C++
- C++正在检查用户是否输入了有效答案