C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で特定の順序で番号を並べることによる最大の番号


この問題では、数値の配列が与えられ、それらを特定の方法で変更することによって作成できる最大の値を見つける必要があります。配置の条件は、偶数と奇数の順序は同じままである必要があります。つまり、すべての偶数の順序を変更することはできません。

概念をよりよく理解するために例を見てみましょう

Input : {17, 80, 99, 27, 14 , 22}
Output: 801799271422
Explanation: the order of Even and Odd numbers is :
Even : 80 14 22
Odd : 17 99 27

ここでは99が最大の数字ですが、17が奇数の順序で前に来るので、最初に80を考慮し、次に- 80 17 99 27 14 22のように順番に並べます。

問題を理解したので、これに対する解決策を生成してみましょう。ここでは、EvenとOddのシーケンスに関する制約が定義されているため、古典的な降順を使用することはできません。したがって、このシーケンスを維持し、EvenおよびOddオーダーの最初の要素の最大のものをチェックする必要があります。そして、そのように行きます。これをより明確にするアルゴリズムを見てみましょう。

アルゴリズム

Step 1 : Create two structures, one for even other for odd, this will maintain the sequence.
Step 2 : Take one element from each structure and check
         which combination makes a large number. Example, if E is
         the even number and O is the odd number which are at the
         top of the structure. then we will check which one is Greater of EO and OE.
Step 3 : Place the greater combination into the final sequence.
Step 4 : Print the final sequence.

それでは、このアルゴリズムに基づいたプログラムを作成しましょう。

#include <bits/stdc++.h>
using namespace std;
string merge(vector<string> arr1, vector<string> arr2) {
   int n1 = arr1.size();
   int n2 = arr2.size();
   int i = 0, j = 0;
   string big = "";
   while (i < n1 && j < n2) {
      if ((arr1[i]+arr2[j]).compare((arr2[j]+arr1[i])) > 0)
         big += arr1[i++];
      else
         big += arr2[j++];
   }
   while (i < n1)
      big += arr1[i++];
   while (j < n2)
      big += arr2[j++] ;
   return big;
}
string largestNumber(vector<string> arr, int n) {
   vector<string> even, odd;
   for (int i=0; i<n; i++) {
      int lastDigit = arr[i].at(arr[i].size() - 1) - '0';
      if (lastDigit % 2 == 0)
         even.push_back(arr[i]);
      else
         odd.push_back(arr[i]);
   }
   string biggest = merge(even, odd);
   return biggest;
}
int main() {
   vector<string> arr;
   arr.push_back("17");
   arr.push_back("80");
   arr.push_back("99");
   arr.push_back("27");
   arr.push_back("14");
   arr.push_back("22");
   int n = arr.size();
   cout<<"Biggest possible number from the array is = "<<largestNumber(arr, n);
   return 0;
}

出力

Biggest possible number from the array is = 801799271422

  1. C++でのデュードニー番号

    与えられた数の底の数理論で定義された数は、最初の自然数の桁の合計が2番目の数の桁の合計に等しくなるように、別の自然数の完全な3乗に等しい自然数です。 (ウィキペディア)。 番号はヘンリー・デュードニーによって発見されました 。その数式 は- ここでは、整数nが与えられます。私たちの仕事は、与えられた番号nが人物番号であるかどうかを確認することです。 問題を理解するために例を見てみましょう 入力: N =17592 出力: いいえ 説明: 与えられた番号はダドニー番号ではありません。 ソリューションアプローチ- 解決策は、デュードニー番号の基本的な定義にあります。

  2. 数が偶数か奇数かをチェックするC++プログラム

    数値は、2で割り切れる場合でも偶数であり、2で割り切れない場合は奇数です。 偶数のいくつかは-です 2, 4, 6, 8, 10, 12, 14, 16 奇数のいくつかは-です 1, 3, 5, 7, 9, 11, 13, 15, 17 モジュラスを使用して数値が偶数か奇数かを確認する モジュラスを使用して数値が偶数か奇数かを確認するプログラムは次のとおりです。 例 #include <iostream> using namespace std; int main() {    int num = 25;    if(num % 2 =