我有项目,这是我的代码。我应该编写一个控制台应用程序,它找到给定文件中最大的k数,并按降序打印这些最大的k数。我的程序应该使用文件名和k作为用户的输入参数。
例如,对于以下文件内容:
3, 5, 12, 54, 12, 3, 654, 11, 46, 7, 3
k = 3的输出应为:
654 54 46
using namespace std;
int main() {
int i, size, p, maxim, k, n, j;
int* a = new int[7000000];
size = 7000000;
ifstream file("7_million_numbers.txt");
if (file.is_open())
{
for (i = 0; i < size; i = i + 1)
file >> a[i];
}
cout << "Enter the number: " << endl;
cin >> n;
for (j = 1; j < n; j = j + 1) {
for (k = 0; k < size - 1; k++) {
maxim = a[k];
p = k;
for (i = k + 1; i < size; i++)
if (a[i] > maxim) {
maxim = a[i];
p = i;
}
a[p] = a[k];
a[k] = maxim;
}
}
for (i = 0; i < n; i++)
cout << a[i] << " " << endl;
system("pause");
delete[] a;
return 0;
}
此代码无效。我有#34; .exe停止工作&#34;问题。是因为数组大小?因为程序读取的文本文件有700万个数字。
答案 0 :(得分:1)
我有一个非常简单的问题解决方案,您可以在输入要显示的数字之前按降序对给定的数字进行排序,排序后您可以询问用户&#34;显示多少个最大数字& #34;当您显示排序结果时,它将自动显示最大的n个数字。
而不是int使它成为长整数。
int main() {
int i, size, p, maxim, k, n, j;
long int* a = new long int[7000000];
size = 7000000;
ifstream file("7_million_numbers.txt");
if (file.is_open())
{
for (i = 0; i < size; i = i + 1)
file >> a[i];
}
cout << "Enter the number: " << endl;
cin >> n;
for(j=0;j<size;j++){
for(k=j;k<size;k++){
if(a[j]<a[k]){
int temp;
temp = a[j];
a[j] = a[k];
a[k] = temp;
}
}
}
for (i = 0; i < n; i++)
cout << a[i] << " " << endl;
system("pause");
delete[] a;
return 0;
}
答案 1 :(得分:0)
在我看来,每次运行只进行一次查找。我认为你不需要将所有数字存储在内存中仅仅是第k个。为此,set<int>
可以很好地运作:
void FindKthLargest( istream& fileIn , ostream& userOut, istream& userIn )
{
int k = 0;
userOut << "Enter the k number: ";
userIn >> k;
set<int> largetNums;
int temp = 0;
for ( int i = 0; i < k; i++ )
{
if ( fileIn >> temp )
{
largetNums.emplace( temp );
}
else
{
userOut << "Number is too big\n";
return;
}
}
while ( fileIn >> temp )
{
set<int>::iterator lowest = largetNums.begin();
if ( temp > *lowest )
{
largetNums.emplace( temp );
largetNums.erase( lowest );
}
}
for ( auto i : largetNums )
{
userOut << i;
}
}