2014-11-03 36 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