当我做排列时,一个向量的错误
Error with a vector when I did permutation
我正在尝试在向量中排列我的数字。
下面是我的代码。这段代码非常简单。首先,向量的输入大小由用户输入决定。然后,当我将所有数字连接到一个字符串中时,为了找到最大整数值和最小整数值,向量中的所有数字被排列。
#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 long
和int
的上限,上述两个函数将抛出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
*/
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为什么一个向量上的多线程操作很慢
- 将一个向量插入另一个向量的某个位置
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 如何按另一个向量的方向调整一个向量?
- 将字符向量复制到另一个向量
- 制作一对共享指针并推送一个向量
- 你能把一个向量<int64>投射到一个向量<uint8>吗
- 大家好,当一个类有一个向量作为它的数据成员时,为什么它的大小总是24?
- 为什么我们需要在优先级队列声明中添加一个向量作为参数?
- 如何将所有指针从一个向量移动到另一个向量?
- 将一个向量映射到不同的对,即使向量映射到每对时是不同的?
- 生成一个类Name_class并将两种数据类型存储在一个向量中
- 使用步骤c++构建一个向量
- 如何从另一个向量中的另一个第一元素减去向量中的第一元素
- 将一个向量对放在一个无序映射与一个映射中