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;
}
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