在C ++中增加数组大小

时间:2016-12-27 03:28:51

标签: c++ arrays

我有项目,这是我的代码。我应该编写一个控制台应用程序,它找到给定文件中最大的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万个数字。

2 个答案:

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