2016-10-08 18 views
1

我想排列我在向量中的數字。我在做排列時出現向量錯誤

以下是我的代碼。這段代碼非常簡單。首先,矢量的輸入大小由用戶輸入確定。然後,向量中的所有數字都進行了置換,以便在將所有數字連接成一個字符串時查找最大整數值和最小整數值。

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <string> 

using namespace std; 

string retS(const vector<int>& v) 
{ 
    string s = ""; 
    for (int e : v) { 
     s += to_string(e); 
    } 
    return s; 
} 


int main(void) { 
    int num = 0; 

    cin >> num; 

    vector<int> numbers; 

    for (int i = 0; i < num; ++i) { 
     int n; 
     cin >> n; 
     numbers.push_back(n); 
    } 

    sort(numbers.begin(), numbers.end()); 

    unsigned long long maxVal = 0; 
    unsigned long long minVal = 987654321; 
    do { 
     string s = retS(numbers); 
     if (stoll(s) > maxVal) { 
      maxVal = stoi(s); 
     } 


     if (stoll(s) < minVal) 
      minVal = stoi(s); 

    } while (std::next_permutation(numbers.begin(), numbers.end())); 

    cout << maxVal+minVal << endl; 
} 

但是,問題是當我輸入兩位數字時發生錯誤。例如,我將10 20 30 40 50 60 70 80 90 20輸入到我的矢量中,然後我的代碼無法工作。我認爲這是因爲整數變量的範圍,因爲如果我假設只有一個或兩個數字的數字可以被接受,串聯的字符串的大小可以是20(〜高達20)。 因此,我從int改變了我的整數變量unsigned long long,這是我認爲存儲整數類型的最長範圍值,但程序在執行時被中止。

所以,你能幫我讓這段代碼運行良好嗎?

+0

預期產量是多少? – Zereges

+0

預期輸出將是所有置換數字中的最大值+最小值並將它們連接起來。 – sclee1

+0

@Anders K.預期輸出取決於輸入值。例如,我輸入了1,2,3,那麼maxVal將是'321',minVal將是'123'。但問題是兩位數值的情況。 – sclee1

回答

2

正如Zereges指出的那樣,這裏的問題是您正試圖存儲超過C++內置的最大數值變量類型的容量的數字。你可以解決這個問題,如字符串存儲這樣長的數字。這將解決您的問題,但會使代碼變慢。

如果你不想用超過必要的字符串打字,這可以幫助你:https://mattmccutchen.net/bigint/這是一個圖書館,與大整數工作。

希望這會有所幫助

2

對不起,我在我的文章中犯了一個錯誤。

---誤區的開頭---

首先,下面的語句也許可能不是你所期望的功能。

sort(numbers.begin(), numbers.end()); 

根據this,排序()排序的範圍內的元素[第一,最後一個)升序排列。實際上,std::next_permutation()也有同樣的問題。

圓括號和方括號的確有區別。 [表示>=,而)表示<。根據你的代碼,最後一個元素不會被排序。

---誤區的終結---

我剛纔發現,end()不返回一個迭代參照矢量容器中的最後一個元素,但在過去的-的 - end元素,它是跟隨向量中最後一個元素的理論元素。

此外,我看到你已經宣佈兩個unsigned long long來保存這些值。

unsigned long long maxVal = 0; 
unsigned long long minVal = 987654321; 

看來987654321是你想存儲的值的上限。但是,您的代碼中存在很少潛在問題,可能會導致值的上限失敗。 (1)maxVal上限不適用。

if (stoll(s) > maxVal) { //may add a upper boundary for maxVal 
    maxVal = stoi(s); 
} 

(2)的stoll()stoi()的功能分別返回一個long longint。如果發現大於上限long longint的數字,上述2個函數將拋出std::out_of_range例外。這是使用這些功能的限制。看起來這是你遇到的運行時錯誤。另外,儘管您試圖聲明unsigned long long來存儲這些值,但它並未釋放使用2個函數的限制。

要解決這個問題,你可以試試Carlos的建議。

下面是Carlos提出的建議的可能實現。

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <string> 

using namespace std; 

string retS(const vector<int>& v) 
{ 
    string s = ""; 
    for (int i = 0; i < v.size(); i++) { 
     s += to_string(v.at(i)); 
    } 
    return s; 
} 

//prone to error 
bool str1GreaterThanStr2(const string str1, const string str2) 
{ 
    if (str1.size() != str2.size()) 
     return (str1.size() > str2.size()); 

    int cursor = 0; 
    while (cursor < str1.size()) 
    { 
     if (str1.at(cursor) != str2.at(cursor)) 
      return (str1.at(cursor) > str2.at(cursor)); 
     cursor++; 
    } 

    return false; //if both string are the same 
} 

int main(void) { 
    int num; 
    vector<int> numbers; 

    cin >> num; 
    for (int i = 0; i < num; ++i) { 
     int n; 
     cin >> n; 
     numbers.push_back(n); 
    } 

    sort(numbers.begin(), numbers.end()); 

    string maxStr = retS(numbers); 
    string minStr = retS(numbers); 

    while (std::next_permutation(numbers.begin(), numbers.end())) 
    { 
     string str = retS(numbers); 
     maxStr = str1GreaterThanStr2(str, maxStr) ? str : maxStr; 
     minStr = str1GreaterThanStr2(str, minStr) ? minStr : str; 
    } 

    cout << maxStr << endl; 
    cout << minStr << endl; 
} 


/* 
test case tried: 
10 
10 20 30 40 50 60 70 80 90 20 
*/ 

希望這會有所幫助。

相關問題