在C++中投影euler#8得到了错误的答案,这是uint_64值的最大值
Project euler #8 in C++ getting wrong answer that is somewhat maximum uint_64 value
下面是我试图解决的问题的链接:https://projecteuler.net/problem=8.
我写了一个代码,当我计算从1到12(包括)个连续数字的乘积时,它似乎工作得很好。例如,我得到的12个相邻数字的最大乘积是1792336896,这似乎是合乎逻辑的,因为它小于9^12。
然而,当我把13而不是12放在代码中时,我得到的答案是18446744073195294960,这太离谱了。我已经看了这几天了,我就是看不出哪里出了问题。如果有人能调查一下,我将不胜感激。
这是我的代码:
#include <iostream>
#include <fstream>
using namespace std;
int numbers[1000];
string line;
string numb;
uint64_t product=0;
void convert(){
for (int i = 0 ; i < numb.length() ; i++)
{
numbers[i] = numb[i] - '0';
}
}
void calculate_lines(){
int digits = 13;
for (int i=0;i<numb.length()-digits;i++){
int temp=1;
for (int j=i;j<digits+i;j++){
if (numbers[j] == 0){
i+=digits;
break;
}
temp=temp*numbers[j];
}
if (temp>=product){
product=temp;
}
}
}
void read_lines(){
ifstream infile;
infile.open("numbers.txt");
if (infile.is_open())
{
while (getline(infile,line))
{
numb+=line;
}
infile.close();
}
}
int main()
{
read_lines();
convert();
calculate_lines();
cout << product << endl;
return 0;
}
使用变量int temp
计算乘积。它不够大,无法包含13位数字的乘积,因此溢出。它变为负值,当转换为uint64_t
时,它后来变为非常大的正值。
虽然保存最终结果product
的变量是uint64_t
,但您需要确保中间值存储在足够大的变量中。你也需要temp
成为uint64_t
。
相关文章:
- 使用递归的数组的最小值.这是怎么回事
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 这是实现图形的坏方法吗
- 当基类是依赖类型时,这是一个缺陷吗
- 当C++中需要自动删除时,这是静态的正确用法吗?
- 这是关于成员访问规则的正确摘要吗
- 这是插入排序的正确实现吗?
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 为什么C++程序在太大时返回代码而不是答案?
- 如何在OpenCV中检测这是谁的脸?
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 这是GoogleTest AssertionResult中的错误吗?
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 这是 basic.def.odr 部分的缺陷吗?
- 被覆盖的函数不会反映在基类中,这是正常行为吗?
- 在C++中投影euler#8得到了错误的答案,这是uint_64值的最大值
- 测试答案是错的,对吗?它不会崩溃,因为我们删除NULL指针,这是安全的