2011-07-13 13 views
6

robię Projekt Eulera # 22:kompilatory dają różne odpowiedzi na Projekt Euler # 22

Korzystanie names.txt (kliknij prawym przyciskiem myszy i 'Zapisz link/element docelowy jako ...'), tekst 46K plik zawierający ponad pięć tysięcy pierwszych imion, zacznij od posortowania go w porządku alfabetycznym. Następnie opracuj alfabetyczną wartość dla każdej nazwy, pomnóż tę wartość przez jej pozycję alfabetyczną na liście , aby uzyskać wynik nazwy.

Na przykład, jeśli lista jest sortowana w porządku alfabetycznym, Colin których warto 3 + 15 + 12 + 9 + 14 = 53, jest 938-ty nazwy na liście . Zatem COLIN uzyskałby wynik 938 × 53 = 49714.

Jaka jest suma wszystkich nazwisk w pliku?

Kompilując mój kod poniżej za pomocą kompilatora Ccwin gcc-g ++, odpowiedzią jest 871129635. Ale z Visual Studio 2008, odpowiedź jest poprawna, 871198282. Dlaczego tak jest?

#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

W swojej funkcji strCmp, dlaczego porównujesz wynik funkcji porównania z -1? Nie ma obietnicy, że porównanie zwróci określoną liczbę, tylko że zwróci liczbę ujemną, jeśli 'lhs

Odpowiedz

9

tutaj:

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

Jesteś zakładając, że std::string::compare powróci -1 za mniej niż wynik, ale w rzeczywistości może zwrócić dowolną wartość ujemną. Możesz to naprawić, używając x.compare(y) < 0, ale lepiej jest po prostu napisać x<y. W rzeczywistości nie potrzebujesz nawet funkcji strCmp, ponieważ domyślnym zachowaniem std::sort jest porównywanie elementów za pomocą operator<.

Powiązane problemy