我有解决这个问题的问题。 第一行的任务很简单我输入了多少个例子。 在第二行,我需要输入我要阅读的数字。 然后我们按空格分隔所有数字。 任务本身就是这样做,将字符串数组从小数字排序到最大数字。之后,如果输入偶数,我们打印中间数字-1,如果它们不均匀,我们只打印中间数字。
到目前为止,如果我使用完全相同的代码并使用long long,它可以完美地工作,但它仅限于19位数字,我想扩展程序,以便它可以使用更大的数字。
使用这种方式排序功能,当我尝试将16个元素从160到10排序时,它们全部搞砸了它从110开始然后在midle是160,所以一个,这绝对没有意义,使用5个数字或8任何问题都可以完美运行,使用更多数字失败。
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
int examples;
cin >> examples;
for (size_t i = 0; i < examples; i++)
{
long long unsigned int n;
cin >> n;
string * numbers = new string[n];
for (size_t i = 0; i < n; i++)
{
cin >> numbers[i];
}
sort(numbers, numbers + n);
if (n % 2 == 0) {
cout << numbers[n / 2 - 1];
}
else
cout << numbers[n / 2];
}
system("pause");
return 0;
}
答案 0 :(得分:2)
首先,如果使用operator new分配内存,则必须使用operator delete []释放它。
其次,当你对字符串而不是值进行排序时,它们就像字符串那样排序,这就是你的问题所在。你看,100按字母顺序小于2或20,这就是为什么它会更早出现。
这是您的程序提供的输出。检查此规则,您会发现我是对的。
10 100 110 120 130 140 150 160 20 30 40 50 60 70 80 90
第三,几乎不鼓励使用operator new。你有STL,你似乎在广泛使用它 - 为什么不用矢量?
第四,你不检查我们写入数字[i]的是否实际上是一个数字。想一想。
第五,因为N足够长(大于2 ^ sizeof(size_t)),你的问题永远不会因整数溢出而停止。
第六,你没有检查n == 0,如果输入它,你最终会得到内存访问冲突。
针对您的问题进行快速右键修复:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main() {
int examples;
cin >> examples;
for (size_t i = 0; i < examples; i++)
{
size_t n;
cin >> n;
if (n <= 0)
break;
vector<string> numbers(n);
for (size_t i = 0; i < n; i++)
cin >> numbers[i];
//here we add a predicate for string checking,
//which evaluates the length of string
//before using the usual operator<.
sort(begin(numbers), end(numbers), [](const string& s1, const string& s2){
if (s1.length() < s2.length())
return true;
if (s2.length() < s1.length())
return false;
else
return (s1 < s2);
});
if (n % 2 == 0) {
cout << numbers[n / 2 - 1];
}
else
cout << numbers[n / 2];
}
system("pause");
return 0;
}
但是,它存在许多问题:
检查数字[i]实际上是否为数字
我不确定 我写的谓词并没有错误 - 我只是想给你 关于它应该如何运作的想法。