2014-11-03 10 views
-1

다음은 내가 풀려고하는 문제에 대한 링크입니다. https://projecteuler.net/problem=8.프로젝트 오일러 # 8 C++에서 약간의 최대 uint_64 값이 잘못된 답을 얻음

1에서 12 (포함 된) 연속 숫자의 제품을 계산하는 동안 잘 작동하는 것으로 보이는 코드를 작성했습니다. 예를 들어 내가 얻은 12 개의 인접한 숫자 중 가장 큰 곱은 1792336896이며 9^12 미만이므로 논리적으로 보입니다.

그러나 내 코드에 12 대신 13을 넣으면 얻을 수있는 대답은 18446744073195294960이며 비례합니다. 나는 지금 이틀을보고 있었고, 나는 어디서 잘못되었는지 보지 못했습니다. 누군가가 조사 할 수 있다면 정말 고맙겠습니다. 당신은 변수 int temp로 제품을 계산

#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 개의 가장 가까운 숫자 값 (0을 제외해야 함)이 최대 제품을 제공한다고 결론을 내릴 수 있다고 생각합니다. –

+0

이 문제는 미친 수학 최적화 정리를 적용 할 필요가 거의 없습니다. 1000 자리 문자열은 쉽게 무차별 대입으로 해결할 수 있습니다. – vz0

+0

[OT] :'i + = digits;'는'i + = j;'이어야한다고 생각합니다. – Jarod42

답변

2

:

여기 내 코드입니다. 이 값은 13 자리의 곱을 포함 할만큼 크지 않으므로 오버플로됩니다. 음수 값이되며 나중에 uint64_t으로 변환하면 매우 큰 양수 값이됩니다.

최종 결과가 product 인 변수는 uint64_t이지만 중간 값은 충분히 큰 변수에 저장해야합니다. tempuint64_t이어야합니다.