2016-12-27 175 views
1

我有项目,这是我的代码。我期望编写一个控制台应用程序,它可以查找给定文件中最大的k个数字,并按降序打印这些最大的k个数字。我的程序应该把文件名和k作为用户的输入参数。在C++中增加数组大小

例如,对于下面的文件内容:

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万个数字。

+1

你有没有尝试过一个文件中有少数? –

+0

“我有'.exe停止工作'问题。”这不是一个问题的技术性描述。在你的调试器中遍历这些代码,找出问题所在;至少,您会得到一个堆栈跟踪,其中包含发生崩溃的行号。 – MrEricSir

+1

问题是什么? – 2016-12-27 04:06:00

回答

1

我对你的问题有一个非常简单的解决方案,你可以按照降序对给定的数字进行排序,然后再输入数字进行排序,排序后你可以询问用户“要显示多少个最大数字”和当您显示排序结果时,它会自动显示最大的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; 



} 
+0

Int can(可能在OP的情况下)的值高达'2147M',比OP的'7M'大。在Windows下,'long int'和'int'的实现是相同的。 – 2016-12-27 04:13:40

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; 
    } 
}