Компиляторы дают разные ответы для Project Euler # 22 - PullRequest
6 голосов
/ 13 июля 2011

Я делаю Project Euler # 22:

Используя names.txt (щелкните правой кнопкой мыши и «Сохранить ссылку / Target As ...»), текстовый файл размером 46 КБ, содержащий более пяти тысячимена, начните с сортировки в алфавитном порядке.Затем определите алфавитное значение для каждого имени, умножьте это значение на его алфавитную позицию в списке, чтобы получить оценку имени.

Например, когда список отсортирован в алфавитном порядке, COLIN, который стоит 3+ 15 + 12 + 9 + 14 = 53, это 938-е имя в списке.Таким образом, COLIN получит оценку 938 × 53 = 49714.

Какова общая сумма всех имен в файле?

Скомпилируйте мой код ниже с помощью gg- Cygwin gcc-Компилятор g ++, ответ 871129635.Но в Visual Studio 2008 ответ правильный, 871198282.Почему это так?

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

1 Ответ

9 голосов
/ 13 июля 2011

Здесь:

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

Вы предполагаете, что std::string::compare вернет -1 для результата, меньшего чем, но на самом деле может вернуть любое отрицательное значение. Вы можете исправить это, используя x.compare(y) < 0, но лучше просто написать x<y. На самом деле, вам даже не нужна функция strCmp, потому что по умолчанию std::sort сравнивает элементы, используя operator<.

...