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

C++で最大部分が3で割り切れるような数の可能なカット


この問題では、大きな整数値(最大10 5 )が与えられます。 数字)。私たちのタスクは、最大パーツが3で割り切れるように必要なカットの総数を印刷することです。

問題を理解するために例を見てみましょう

入力 − 9216

出力 − 3

説明 −数値は9 | 21|6として除算されます。

この問題を解決するには、数値の最下位ビット、つまり数値の最後の桁から開始する必要があります。ここでは、3で割り切れる最小の数を見つけます。そして、それに基づいてカウントを更新します。

− arr [i]が3の除算可能な数値を作成する場合、カウントを増やして数値の次の桁に移動します。 arr [i]が3で割り切れない場合は、それを次の桁と組み合わせて、3で割り切れるかどうかを確認します。

3の除算 −数値の桁数が3で割り切れる場合、数値は3で割り切れます。

ソリューションの実装を示すプログラム

#include <bits/stdc++.h>
using namespace std;
int countMaximum3DivisibleNumbers(string number){
   int n = number.length();
   vector<int> remIndex(3, -1);
   remIndex[0] = 0;
   vector<int> counter(n + 1);
   int r = 0;
   for (int i = 1; i <= n; i++) {
      r = (r + number[i-1] - '0') % 3;
      counter[i] = counter[i-1];
      if (remIndex[r] != -1)
         counter[i] = max(counter[i], counter[remIndex[r]] + 1);
         remIndex[r] = i+1;
   }
   return counter[n];
}
int main() {
   string number = "216873491";
   cout<<"The number of 3 divisible number created by cutting "<<number<<" are : " <<countMaximum3DivisibleNumbers(number);
   return 0;
}

出力

The number of 3 divisible number created by cutting 216873491 are : 5

  1. C++で2つの要素が隣接しないような循環配列の最大合計

    この問題では、循環配列cirArr[]が与えられます。私たちのタスクは、C++で2つの要素が隣接しないように循環配列の最大合計を見つけるプログラムを作成することです。 問題の説明 循環配列の場合、隣接する要素を取得できないように、配列の要素の最大合計を見つける必要があります。つまり、代替要素を取得する必要があります。 循環アレイ は、配列の最後の要素が最初の要素に接続されている特殊なタイプの配列です。 問題を理解するために例を見てみましょう 入力 cirArr[] = {4, 1, 5, 3, 2} 出力 9 説明 最大合計循環サブシーケンスは[4、5、2]です。合計=9 ソリ

  2. C ++で追加するたびにBで割り切れるように、AにN桁を追加しますか?

    ここでは、N桁を追加して数値Aを生成する方法を説明します。各段階で新しい桁を追加すると、別の数値Bで割り切れます。4を追加して5桁の数値を作成するとします。それと余分な数字。 7で除算できるかどうかを確認します。数値は8から始まります。したがって、最初は4が追加されるため、数値は84になり、7で割り切れます。次に、数値に0を加算して、で割り切れるようにします。 7.番号を生成できない場合は、-1が返されます。 アルゴリズム addNDigits(a、b、n) begin    num := a    for all number x from 0 to