编译器为Project Euler#22提供了不同的答案

时间:2011-07-13 16:41:27

标签: c++ visual-studio g++ cygwin

我在做Euler项目#22:

  

使用names.txt(右键单击并将“保存链接/目标为...”),一个46K文本   包含超过五千个名字的文件,首先对其进行排序   按字母顺序排列。然后计算出字母值   每个名称,将该值乘以其中的字母位置   列表以获得名称分数。

     

例如,当列表按字母顺序排序时,COLIN,   值得3 + 15 + 12 + 9 + 14 = 53,是第938名   名单。因此,COLIN将获得938×53 = 49714的分数。

     

文件中所有名称分数的总和是多少?

使用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 个答案:

答案 0 :(得分:9)

下面:

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

您假设std::string::compare将返回-1以获得小于结果,但实际上它可以返回任何负值。您可以使用x.compare(y) < 0解决此问题,但最好只编写x<y。实际上,您甚至不需要strCmp函数,因为std::sort的默认行为是使用operator<比较元素。