c – 编译器为Project Euler#22提供不同的答案
我正在做项目欧拉#22:
使用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<来比较元素. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |