加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:26:41 所属栏目:百科 来源:网络整理
导读:我正在做项目欧拉#22: Using names.txt (right click and ‘Save Link/Target As…’),a 46K text file containing over five-thousand first names,begin by sorting it into alphabetical order. Then working out the alphabetical value for each name,
我正在做项目欧拉#22:

Using names.txt (right click and ‘Save Link/Target As…’),a 46K text
file containing over five-thousand first names,begin by sorting it
into alphabetical order. Then working out the alphabetical value for
each name,multiply this value by its alphabetical position in the
list to obtain a name score.

For example,when the list is sorted into alphabetical order,COLIN,
which is worth 3 + 15 + 12 + 9 + 14 = 53,is the 938th name in the
list. So,COLIN would obtain a score of 938 × 53 = 49714.

What is the total of all the name scores in the file?

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

解决方法

这里:
if(x.compare(y) == -1)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读