2011-07-13 33 views
6

tôi đang làm dự án Euler # 22:Trình biên dịch cung cấp cho câu trả lời khác nhau cho Dự án Euler # 22

Sử dụng names.txt (nhấp chuột phải và 'Save Link/Target As ...'), một văn bản 46K tệp chứa hơn năm nghìn tên đầu tiên, bắt đầu bằng cách sắp xếp nó thành thứ tự chữ cái. Sau đó, tính toán giá trị theo thứ tự chữ cái cho mỗi tên, nhân giá trị này theo vị trí chữ cái của nó trong danh sách để có được điểm số tên.

Ví dụ: khi danh sách được sắp xếp theo thứ tự bảng chữ cái, COLIN, trị giá 3 + 15 + 12 + 9 + 14 = 53, là tên 938 trong danh sách . Vì vậy, COLIN sẽ có được số điểm là 938 × 53 = 49714.

Tổng số điểm tên trong tệp là bao nhiêu?

Biên dịch mã của tôi bên dưới với trình biên dịch gcc-g ++ của Cygwin, câu trả lời là 871129635. Nhưng với Visual Studio 2008, câu trả lời là chính xác, 871198282. Tại sao điều này là trường hợp?

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

Trong hàm strCmp của bạn, tại sao bạn so sánh kết quả của hàm so sánh với -1? Không có lời hứa rằng so sánh sẽ trả lại một số cụ thể, chỉ là nó sẽ trả về một số âm nếu 'lhs

Trả lời

9

đây:

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

Bạn đang giả định rằng std::string::compare sẽ trở lại -1 cho một ít so với kết quả, nhưng nó có thể trên thực tế trả lại bất kỳ giá trị âm. Bạn có thể sửa lỗi này bằng cách sử dụng x.compare(y) < 0, nhưng tốt hơn là chỉ viết x<y. Thực tế, bạn thậm chí không cần hàm strCmp vì hành vi mặc định của std::sort là so sánh các phần tử sử dụng operator<.

Các vấn đề liên quan