我有项目,这是我的代码。我期望我编写一个控制台应用程序,该应用程序在给定文件中找到最大的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;
}
此代码不起作用。我有" .exe停止工作"问题。是因为数组尺寸吗?因为正在读取程序的文本文件具有700万个数字。
我对您的问题有一个非常简单的解决方案,您可以在降序之前按降序对给定的数字进行排序最大的数字要显示"
而不是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;
}
在我看来,您每次运行只做一个查找。我认为您不需要仅将所有数字存储在内存中最大。为此,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 bign";
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;
}
}