2016-10-08 16 views
0

私は単純なC++プログラムを書いて、配列内にいくつの重複があるかを調べました。配列番号の重複をチェックする

これは私にとっては完璧に機能しますが、これは非常に長いコードです。そして、私は正常にこのタスクを実行する可能性のあるショートコードがあるかどうかを知りたい:

#include<iostream> 
using namespace std; 
int main() 
{ 
int a[10]; 
int reper=0,word=0,flage=0,number[10]={ 
    0 
}; 
//Getting Input From User 
for (int i = 0; i <=9; i++) 
{ 
    cout<<"Enter The Value For "<<i<<" Index"<<endl; 
    cin>>a[i]; 
} 
//Checking The Duplicates Numbers 
for (int i = 0; i <= 9; i++) 
{ 
    reper=0; 
    flage=0; 

    for (int j = 0; j <=9; j++) 
    { 
     if (a[i]==a[j]) 
     { 
      if (i!=j) 
      { 
       reper++; 
      } 
     } 
    } 
    number[i]=a[i]; 
    for (int k = 0; k <=9; k++) 
    { 
     if (i!=k) 
     { 
      if(number[i]==number[k]) 
      { 
      flage=1; 
      break; 
      } 
     } 
    } 
    //If There Are Duplicates Then Prints That Numebr, How Many Times It Repeated And Total Occurance Of That Number In The Array 
    if (reper!=0&&flage==0) 
    { 
     cout<<"Repeated Number Of The Array Is : "<<a[i]<<" "; 
     cout<<"And This Number Repeated "<<reper<<" Times "<<"And Total Occurance Of This Number is : "<<reper+1<<endl; 
     word=a[i]; 
    } 
} 
//If There Is Nothing Any Duplicate In The Array Then Simply Prints This Message On Console 
if (reper==0&&word==0) 
{ 
    cout<<"There Is Nothing Any Repeated Number Of This Array: "<<endl; 
} 
system("Pause"); 
return 0; 
} 
+7

この質問は短い方法を求めていますので、基本的に[codereview]を求めています。 se]。 – Rakete1111

+1

これはhttp://codereview.stackexchange.comで良い質問になります。 –

答えて

0

最も簡単な方法は、これを実装するためにIMHO - http://en.cppreference.com/w/cpp/container/multisetを使用します。それは対数複雑さと繰り返し項目を数える内部メソッドを持っています。

#include <iostream> 
#include <set> 

int main(int argc, char *argv[]) 
{ 
    std::multiset<int> ms; 

    //Getting Input From User 
    for (int i = 0; i <=9; i++) 
    { 
     std::cout<<"Enter The Value For "<<i<<" Index"<<std::endl; 
     int val; 
     std::cin>>val; 
     ms.insert(val); 
    } 

    bool repeated_number_found=false; 

    std::multiset<int>::const_iterator it = ms.begin(); 
    while (it != ms.end()) { 
     int reper=ms.count(*it); 
     if (reper > 1){ 
      std::cout << "Number " << *it << " repeated for " << reper << " times" << std::endl; 
      repeated_number_found=true; 
     } 
     it = ms.upper_bound(*it); 
    } 

    if (!repeated_number_found){ 
     std::cout<<"There Is Nothing Any Repeated Number Of This Array"<<std::endl; 
    } 

    return 0; 
} 

しかし、それはあなたに重要な場合は、繰り返し数の最初の入り口を失うことになる。このコンテナを使用して、私が入力した番号付き入場番号を保持する構造体またはSTD ::ペアを使用することをお勧めします: 以下の例を参照してください。この場合、カスタムコンパレータも用意する必要があります(ドキュメントを参照してください)。

0

私はこれを達成するためのより良い方法は、配列をソートし、このような何かをすることだと思う: -

は(これを実行する前に、ヘッダファイルのアルゴリズムが含まれています。)

vector <int> a (10,0); 
for (int i = 0; i <=9; i++) 
{ 
    cout<<"Enter The Value For "<<i<<" Index"<<endl; 
    cin>>a[i]; 
} 
int count = 0; 
sort(a.begin(), a.end()); 
for(int i = 0; i < a.size() - 1; i++) { 
if (a[i] == a[i + 1]) { 
    count++; 
    } 
} 
cout << count << endl; 
+0

これは実用的な方法であり、O(N log N)です。ただし、ハッシュテーブルを使用してO(N)時間に実行できます。 –

+0

こんにちはRahul、 私の質問にお答えしていただきありがとうございます。 しかし、私はあなたの与えられたコードをコンパイルしようとすると問題に直面しています。 この行でエラーが発生します sort(a.begin()、a.end()); アルゴリズムヘッダーファイルを既に追加しました。 –

+0

sort(a.begin()、a.begin()+ 10)を使用してみてください。 –