gpt4 book ai didi

c++ - 从输入中创建最大可能的数字 - cout 的实现问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:15:34 24 4
gpt4 key购买 nike

我正在尝试实现一种算法,该算法将采用一组数字并输出尽可能大的数字(不分解单个数字)。所以在这样的例子中,我给出了 4 个数字:

4

43 12 3 91

输出将是91-43-3-12 或 9143312。

我的尝试如下。

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

using std::vector;
using std::string;

bool compare (int x, int y) {
std::cout << "in func \n";
string a = std::to_string(x);
string b = std::to_string(y);
std::cout << a << " " << b << "\n";
std::cout << std::stoi(a.substr(0, 1)) << " " << std::stoi(b.substr(0, 1)) << "\n" ;
if (std::stoi(a.substr(0, 1)) < std::stoi(b.substr(0, 1))) {
std::cout.flush();
std::cout << "if \n";
return true;
}
else {
std::cout.flush();
std::cout <<"else \n";
return false;
}
}
string largest_number(vector<string> a) {
std::stringstream ret;

while (a.size() > 0) {
int maxNumber =-1;
int index = -1;
std::cout << "going into for " << a.size() << "\n";
for (size_t i = 0; i < a.size(); i++) {
if (! compare (stoi(a[i]), maxNumber ) ) { //stoi(a[i]) >= maxNumber) {
maxNumber = stoi(a[i]);
std::cout << maxNumber << " " << i << "\n";
index = i;
}
std::cout << "here \n";
}
ret << maxNumber;
a.erase(a.begin() + index);
}
string result;
ret >> result;
return result;
}

int main() {
int n;
std::cin >> n;
vector<string> a(n);
for (size_t i = 0; i < a.size(); i++) {
std::cin >> a[i];
}
std::cout << largest_number(a);
}

我不明白我的compare 函数有什么问题。当我运行它时,用这个输入说:

$ g++ -pipe -O2 -std=c++14 largest_number.cpp -lm -o largest1
$ ./largest1.exe
4
4 23 1 45
going into for 4
in func
4 -1

它不会在条件 ifelse 中打印 cout 语句。这怎么可能?我什至试过冲洗。但是,如果我取出整个条件,放入一个 cout 语句并返回 true 或其他东西,那么它会完整地运行程序(尽管这不是预期的输出)。

我不介意严厉的批评。我在这里做错了什么?任何建议将被认真考虑。

提前致谢。

最佳答案

在这个声明中

std::cout << std::stoi(a.substr(0, 1)) << " " << std::stoi(b.substr(0, 1)) << "\n" ; 

当 b 等于 -1表达式 b.substr(0, 1)等于 std::string 类型的对象包含一个字符 '-'那是减号。

如果应用标准函数std::stoi对于这样的字符串,将抛出异常。

考虑以下代码片段

std::string s("-");

try
{
std::stoi(s);
}
catch (const std::exception &e)
{
std::cout << e.what() << std::endl;
}

它的输出将是

invalid stoi argument

看来你需要的只是对字符串进行排序。例如

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

int main()
{
std::vector<std::string> v { "4", "23", "1", "45" };

auto cmp = [](const std::string &a, const std::string &b)
{
std::string::size_type i = 0, m = a.size();
std::string::size_type j = 0, n = b.size();
int result;

do
{
if (m < n)
{
result = a.compare(i, m, b, j, m);
j += m;
n -= m;
}
else
{
result = a.compare(i, n, b, j, n);
i += n;
m -= n;
}
} while (result == 0 && m && n);

return 0 < result;
};


std::sort(v.begin(), v.end(), cmp);

for (const auto &s : v) std::cout << s;
std::cout << std::endl;

return 0;
}

程序的输出将是

454231

或者对于这组数字

std::vector<std::string> v{ "43", "12", "3", "91" };

输出将是

9143312

或多一组数字

std::vector<std::string> v{ "93", "938" };

输出将是

93938

关于c++ - 从输入中创建最大可能的数字 - cout 的实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41539657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com