2017-04-02 1 views
-1

에서 가장 큰 제품 찾기 :나는 다음과 같은 문제를 해결하기 위해 노력하고 일련의

https://projecteuler.net/problem=8는 기본적으로 나는 2 차원 배열을 통해 갈거야을하고 8 개 방향의 각 (N, NW, NE에서 13 자리의 제품을 받고, E, W, S, SW, SE) 및 반환 값을 최대 값 (있는 경우)으로 설정합니다.

하지만 64497254400의 대답이 잘못되어 있습니다. 내가 뭘 잘못하고 있는지에 대한 암시는 없습니까?

#include <stdio.h> 
#include <iostream> 
#include <fstream> 

using namespace std; 

long long int MAX(long long int a, long long int b) 
{ 
    if (a > b) 
    { 
     return a; 
    } 
    else 
    { 
     return b; 
    } 
} 

void largest_product_in_series(int param) 
{ 
    char filename[] = "8_.txt"; 
    char my_character ; 
    int column = 0; int row = 0; 
    int c = 0; int r = 0; int cc = 0; int rr = 0; 
    int list[100][100]; 
    int num = param - 1; 

    ifstream fin; 
    fin.open(filename, ios::in); 

    while (!fin.eof()) 
    { 
     fin.get(my_character); 
     if (my_character == '\n') 
     { 
      row++; 
      r++; 
      c = 0; 
      cout << endl; 
     } 
     else 
     { 
      if (row == 0) 
      { 
       column++; 
      } 
      list[r][c] = (my_character - '0'); 
      cout << list[r][c]; 
      c++; 
     } 
    } 

    cout << "Column: " << column << endl; 
    cout << "Row: " << row << endl; 

    long long int greatest_product = 0; 

    long long int product = 0; 

    for (rr = 0; rr < row; rr++) 
    { 
     for (cc = 0; cc < column; cc++) 
     { 
      //cout << "Column: " << cc << " Row: " << rr << endl; 
      if (rr >= num) 
      { 
       r = rr; 
       c = cc; 
       product = list[r--][c]; 

       for (int i = 0; i < num; i++) 
       { 
        product *= list[r--][c]; 
       } 
       greatest_product = MAX(greatest_product, product); 
      } 
      if ((rr + num) <= row) 
      { 
       r = rr; 
       c = cc; 
       product = list[r++][c]; 

       for (int i = 0; i < num; i++) 
       { 
        product *= list[r++][c]; 
       } 
       greatest_product = MAX(greatest_product, product); 
      } 
      if (cc >= num) 
      { 
       r = rr; 
       c = cc; 
       product = list[r][c--]; 

       for (int i = 0; i < num; i++) 
       { 
        product *= list[r][c--]; 
       } 
       greatest_product = MAX(greatest_product, product); 
      } 
      if ((cc + num) <= column) 
      { 
       r = rr; 
       c = cc; 
       product = list[r][c++]; 

       for (int i = 0; i < num; i++) 
       { 
        product *= list[r][c++]; 
       } 
       greatest_product = MAX(greatest_product, product); 
      } 
      if ((rr >= num) && (cc >= num)) // NW 
      { 
       r = rr; 
       c = cc; 
       product = list[r--][c--]; 
       for (int i = 0; i < num; i++) 
       { 
        product = list[r--][c--]; 
       } 
       greatest_product = MAX(greatest_product, product); 
      } 
      if ((rr >= num) && ((cc + num) <= column)) // NE 
      { 
       r = rr; 
       c = cc; 
       product = list[r--][c++]; 
       for (int i = 0; i < num; i++) 
       { 
        product = list[r--][c++]; 
       } 
       greatest_product = MAX(greatest_product, product); 
      } 
      if (((rr + num) <= row) && ((cc >= num))) // SW 
      { 
       r = rr; 
       c = cc; 
       product = list[r++][c--]; 
       for (int i = 0; i < num; i++) 
       { 
        product = list[r++][c--]; 
       } 
       greatest_product = MAX(greatest_product, product); 
      } 
      if (((rr + num) <= row) && ((cc + num) <= column)) // SE 
      { 
       r = rr; 
       c = cc; 
       product = list[r++][c++]; 
       for (int i = 0; i < num; i++) 
       { 
        product = list[r++][c++]; 
       } 
       greatest_product = MAX(greatest_product, product); 
      } 
      //cout << "G: " << greatest_product << endl; 
     } 
    } 
    cout << "Greatest Product: " << greatest_product << endl; 
} 

int main(void) 
{ 
    largest_product_in_series(13); 
    return 0; 
} 
+1

아마도 버그는 아니지만 'while (! fin.eof())'는 수정해야 할 가치가 있습니다. 자세한 정보는 다음과 같습니다 : [iostream :: eof가 루프 상태에있는 이유는 무엇입니까?] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – user4581301

+1

당신이 잘못하고있는 것은 매우 분명합니다. 실행되는 동안 한 번에 한 줄씩 코드를 단계별로 실행하기 위해 디버거를 사용하지 않고 모든 변수의 값을 검사하여 프로그램의 실제 논리가 어떻게 다른지 확인하십시오 기대 한 결과. 디버거를 사용하는 방법을 아는 것은 모든 C++ 개발자에게 필요한 기술입니다. 너 혼자 이것을 알아낼 수 있어야한다. 이것은 정확히 디버거의 목적입니다. –

답변

0

난 당신의 코드를 실행, 그것은 열이 50라고하고는 20X50해야하기 때문에 행이, 조금 이상한 것 같다 (21)이다

다음은 내 간단, 비효율적 인 솔루션입니다 21x50 배열이 아니라 1050 자리 숫자입니다. 가장 좋은 추측은 실수로 21 행에 인쇄 할 수없는 문자를 저장하고 제품에 그 중 일부가 포함되어 있다는 것입니다.

또한, 루프의 일부 대신 product *= ...

product = ...을 그리고 마지막으로,이 대답에 영향을주지 것입니다,하지만 당신은 앞뒤로 몇 가지 숫자의 제품을 얻을 그래서 만약 곱셈, 결과 교환 법칙이 성립입니다 같은 것입니다. 따라서 Nxor W 방향으로 모든 것을 제거하여 솔루션을 간소화 할 수 있습니다.

관련 문제