2011-07-13 36 views
6

que estoy haciendo Proyecto Euler # 22:compiladores dan diferentes respuestas para Proyecto Euler # 22

Usando nombres.txt (clic derecho y 'Guardar enlace/destino como ...'), un texto 46K archivo que contiene más de cinco mil nombres, comience por ordenarlo en orden alfabético. Luego, calculando el valor alfabético de para cada nombre, multiplique este valor por su posición alfabética en la lista para obtener un puntaje de nombre.

Por ejemplo, cuando la lista está ordenada en orden alfabético, Colin, que vale 3 + 15 + 12 + 9 + 14 = 53, es el nombre 938a en la lista . Entonces, COLIN obtendría un puntaje de 938 × 53 = 49714.

¿Cuál es el total de todas las puntuaciones en el archivo?

Al compilar mi código a continuación con el compilador gcc-g ++ de Cygwin, la respuesta es 871129635. Pero con Visual Studio 2008, la respuesta es correcta, 871198282. ¿Por qué es este el caso?

#include<iostream> 
#include<fstream> 
#include<vector> 
#include<algorithm> 
using namespace std; 

bool strCmp(string x, string y) { 
    if(x.compare(y) == -1) 
     return true; 
    else 
     return false; 
} 

int getScore(string s) { 
    int score = 0; 
    for(unsigned int i = 0; i < s.length(); i++) 
     score += (((int) s.at(i)) - 64); 
    return score; 
} 

int getTotalScore(vector<string> names) { 
    int total = 0; 
    for(unsigned int i = 0; i < names.size(); i++) 
     total += (getScore(names[i]) * (i+1)); 
    return total; 
} 

int main() { 
    vector<string> names; 
    ifstream namesFile("names.txt"); 

    char curChar; 
    string curName = ""; 

    //get names from file 
    if(namesFile.is_open()) { 
     while(!namesFile.eof()) { 
      curChar = namesFile.get(); 

      if(isalpha(curChar)) 
       curName.push_back(curChar); 
      else { 
       if(!curName.empty()) {//store finished name 
        names.push_back(curName); 
        curName.clear(); 
       } 
      } 
     } 
    } 
    namesFile.close(); 

    //alphabetize 
    sort(names.begin(), names.end(), strCmp); 

    //count up name scores 
    cout << getTotalScore(names) << endl; 
    return 0; 
} 
+2

En su función strCmp, ¿por qué compara el resultado de la función de comparación contra -1? No hay ninguna promesa de que comparar devolverá un número específico, solo que devolverá un número negativo si 'lhs

Respuesta

9

aquí:

if(x.compare(y) == -1) 

Usted está asumiendo que std::string::compare volverá -1 de un menor a la consecuencia, pero de hecho, puede devolver cualquier valor negativo. Puede solucionar esto usando x.compare(y) < 0, pero es mejor escribir x<y. De hecho, ni siquiera necesita la función strCmp porque el comportamiento predeterminado de std::sort es comparar los elementos usando operator<.

Cuestiones relacionadas