2016-10-08 19 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 
*/ 

希望这会有所帮助。

相关问题