2016-12-27 7 views
1

私はプロジェクトを持っており、これは私のコードです。私は与えられたファイルの中で最大のk個の数字を見つけ出し、これらの最大のk個の数字を降順で表示するコンソールアプリケーションを書くことが期待されています。私のプログラムは、ユーザから入力パラメータとしてファイル名とkを取る必要があります。次のファイルの内容については、例えばC++での配列サイズの増加

:K = 3

3, 5, 12, 54, 12, 3, 654, 11, 46, 7, 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

何が問題なのですか? –

答えて

1

私はあなたの問題を非常に簡単な解決方法があります。並べ替え後、表示する数字の入力を取る前に降順で並べ替えることができます。ソートされた結果を表示すると、自動的に最大のn個の数値が表示されます。

intの代わりにintをlongにします。

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(おそらくOPの場合でも)はOPの '7M'よりもかなり大きい' 2147M'までの値を保持します。 Windowsでは 'long int'と' int'の実装は同じです。 –

0

実行ごとに1回のみルックアップを行っているようです。私は、あなたがメモリ内のすべての数字を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; 
    } 
} 
関連する問題