当我做排列时,一个向量的错误

Error with a vector when I did permutation

本文关键字:一个 向量 错误 排列      更新时间:2023-10-16

我正在尝试在向量中排列我的数字。

下面是我的代码。这段代码非常简单。首先,向量的输入大小由用户输入决定。然后,当我将所有数字连接到一个字符串中时,为了找到最大整数值和最小整数值,向量中的所有数字被排列。

#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类型,我认为这是存储整数类型的最长范围值,但是,当我执行时程序被终止。

所以,你能帮我让这段代码工作得很好吗?

正如Zereges所指出的,这里的问题是您试图存储的数字超过了c++内置的最大数值变量类型的容量。您可以解决将长数字存储为字符串的问题。这将解决您的问题,但它会使您的代码变慢一点。

如果你不想与不必要的字符串作斗争,这可以帮助你:https://mattmccutchen.net/bigint/这是一个处理大整数的库。

希望能有所帮助

对不起,我写错了。

——错误的开始——

首先,下面的语句可能不像你期望的那样起作用。

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

据此,sort()将[first,last]范围内的元素按升序排序。事实上,std::next_permutation()也存在同样的问题。

括号和方括号确实是有区别的。[表示>=, )表示<。根据您的代码,最后一个元素不会排序。

——错误的结束——

我刚刚发现,end()返回的不是指向vector容器中最后一个元素的迭代器,而是指向过尾元素的迭代器,即理论上指向vector容器中最后一个元素的元素。

此外,我看到您声明了两个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 long和一个int。如果捕获的数字大于long longint的上限,上述两个函数将抛出std::out_of_range异常。这是使用函数的限制。这似乎是您遇到的运行时错误。此外,尽管您已经尝试声明unsigned long long来存储这些值,但它并没有释放使用这两个函数的限制。

要解决这个问题,你可以试试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
*/