2016-09-26 4 views
0

私は4つの異なる数字の配列を持っていると言う。C++、一意性を見つけるために数字の配列を並べ替え

int numbers [4] = {50234、50356、50454、50934};

C++でネストされたforループを作成して、一意性に必要な桁数を識別するために、これらの数値を前後に並べ替える方法を教えてください。

この例では、同じ数字の尾が数字に含まれていないことを確認するために、3桁の数字が必要であることがわかります。 50234、50934 = 3桁でそれぞれユニーク= 502と509です。

これらの数字のそれぞれを1つずつ、数字で番号をつけて、同じ数字を並べ替えて3の出力に達すると、forループの外観はどうなりますか?この番号を破棄し、それは次に

同じではありません -

6:

それはこのように行くだろう

5 - 次に

この番号を破棄:

9万歳!もう類似した数字はありません。答えは3です。

私は困惑しており、理解できません。

ご協力いただきますようお願い申し上げます。ありがとうございます。

+0

本当に番号を確認する必要はありませんか? '502123456789'と' 503123456789'には、後ろから同じ数字がたくさんありますが、数字は異なります。 – NathanOliver

+0

illogicのロジックがありません – Raindrop7

+0

私はC++を初心者にしており、初心者にはぴったりです。番号を確認する必要はありません。私はちょうどそれが後ろから正面への番号のあらゆる位置を通過するようにしたい。数字が似ていない数字は破棄し、数字が似ていない数字の位置に達すると停止することができます。それは理にかなっていますか? :/ – Mitrani

答えて

2

はあなたが文字列のベクトルにそれを変換することができ

#include <unordered_set> 
#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() { 
    const std::vector<int> numbers{50234, 50356, 50454, 50934}; 

で始まる言う:

std::vector<std::string> string_numbers; 
    std::for_each(std::begin(numbers), std::end(numbers), [&](int n){ string_numbers.push_back(std::to_string(n)); }); 

今は1から始まり、必要な桁数をチェックします:

size_t digits = 1; 
    while(true) { 

各繰り返しで、unordered_set

0123を作成します。番号ごと
 std::unordered_set<std::string> partials; 

、我々がセットにそれのdigits数字を配置しようとします:セットのサイズは、ベクトルの大きさであれば

 for(const auto &s: string_numbers) { 
      if(s.size() <= digits) { 
       std::cout << "not unique" << std::endl; 
       return 0; 
      } 
      partials.insert(s.substr(0, digits)); 
     } 

、我々は終わった:

 if(partials.size() == numbers.size()) { 
       std::cout << digits << " required" << std::endl; 
       return 0; 
      } 

そうでなければ、我々は、桁数を増やす必要があります。

 ++digits; 
    } 
} 

全コード:

#include <unordered_set> 
#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() { 
    const std::vector<int> numbers{50234, 50356, 50454, 50934}; 

    std::vector<std::string> string_numbers; 
    std::for_each(std::begin(numbers), std::end(numbers), [&](int n){ string_numbers.push_back(std::to_string(n)); }); 

    size_t digits = 1; 
    while(true) { 
     std::unordered_set<std::string> partials; 
     for(const auto &s: string_numbers) { 
      if(s.size() <= digits) { 
       std::cout << "not unique" << std::endl; 
       return 0; 
      } 
      partials.insert(s.substr(0, digits)); 
     } 
     if(partials.size() == numbers.size()) { 
       std::cout << digits << " required" << std::endl; 
       return 0; 
      } 
     ++digits; 
    } 
} 
+0

こんにちはAmi、ちょうどここであなたのソリューションをありがとうと言いたいと思います。私はまだC++にはまだ新しいです。これは私が理解できるレベルを超えていますが、私が必要としている答えに私を任せました。ありがとうございました。 – Mitrani

0

あなたは数字をソートする場合はそのソートアルゴリズムの一つだが、バブルソートを言わせて使用​​します。その後、一意性を確認し、新しい配列にユニークな値を格納し、それらを印刷:

は、我々は理解と実践のために我々のコードを作るが、我々はライブラリを使用し、実際のプログラムの中で、彼らは迅速あまり強力であると:

#include <iostream> 
using std::cout; 
using std::endl; 



int main() 
{ 

    int numbers[4] = {50234, 50356, 50454, 50934}; 
// int numbers[4] = {50234, 50356, 50454, 50356}; 

    for(int i(0); i < 4; i++) 
    { 
     for(int j(i + 1); j < 4; j++) 
     { 
      if(numbers[i] > numbers[j]) 
      { 
       numbers[i] ^= numbers[j]; 
       numbers[j] ^= numbers[i]; 
       numbers[i] ^= numbers[j]; 
      } 
     } 
    } 

    for(int i = 0; i < 4; i++) 
     cout << numbers[i] << ", "; 

    int nUniq = 0; 
    bool isUniq = true; 

    for(int i = 0; i < 4; i++) 
    { 
     isUniq = true; 

     for(int j(i + 1); j < 4; j++) 
     { 
      if(numbers[i] == numbers[j]) 
      { 
       isUniq = false; 
       break; 
      } 
     } 
     if(isUniq) 
      nUniq++; 
    } 

    cout << nUniq << endl; 

    int* ptrUniq = new int[nUniq]; 
    int k = 0; 

    for(int i = 0; i < 4; i++) 
    { 
     isUniq = true; 

     for(int j(i + 1); j < 4; j++) 
     { 
      if(numbers[i] == numbers[j]) 
      { 
       isUniq = false; 
       break; 
      } 
     } 
     if(isUniq) 
     { 
      ptrUniq[k] = numbers[i]; 
      k++; 
     } 
    } 

    cout << "\nhere are uniq values:\n\n"; 
    for(int i = 0; i < nUniq; i++) 
     cout << ptrUniq[i] << ", "; 

    delete[] ptrUniq; 
    ptrUniq = NULL; 


    cout << endl << endl; 
    return 0; 
} 
関連する問題