2014-11-03 37 views
-1

下面是我试图解决的问题的链接:https://projecteuler.net/problem=8在C++中的项目欧拉#8得到错误的答案,这是最大的uint_64值

我已经写了一个代码,似乎在我计算任何从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; 
} 
+0

我相信你有过这样的想法;如果你再次考虑这个问题,我相信你会得出结论,13个最大的相邻数字值(肯定排除任何零)将会给你最大的产品。 – 2014-11-03 15:47:45

+0

这个问题很难应用一些疯狂的数学优化定理。一个1000位数的字符串可以很容易地通过暴力解决,这很好。 – vz0 2014-11-03 15:59:20

+0

[OT]:我认为'i + = digits;'应该是'i + = j;'。 – Jarod42 2014-11-03 16:01:26

回答

2

您与变量int temp计算产品。这不足以包含13位数字的产品,因此会溢出。它变成一个负值,当转换为uint64_t时,它将变成一个非常大的正值。

虽然保存最终结果product的变量是uint64_t,但您需要确保中间值存储在足够大的变量中。您还需要tempuint64_t