我无法解决这个问题。
任务很简单,在第一行输入我有多少个例子。
在第二行,我需要输入我要读取的数字数量。
然后我们输入所有由空格分隔的数字。
任务本身做,用数字从小到大对字符串数组进行排序。之后,如果我们输入的是偶数,我们打印中间的数字 -1,如果它们是奇数,我们只打印中间的数字。
到目前为止,如果我使用与 long long 完全相同的代码,它可以完美地工作,但它仅限于 19 位数字,我想扩展程序以便它可以使用更大的数字。
使用排序函数,当我尝试对从 160 到 10 的 16 个元素进行排序时,他们都把它从 110 开始搞砸了,然后在中间是 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;
}
首先,如果你用 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,而且您似乎在广泛使用它 - 为什么不用 vector ?
第四,你不检查我们写入 numbers[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;
}
不过,它还是有一些问题:
检查 numbers[i] 是否真的是一个数字
我不确定
我写的谓词没有错误 - 我只是想给你
它应该如何工作的想法。