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

C++では3ではなく8で割り切れる部分文字列の数


0〜9の文字列が指定されます。この問題では、3ではなく8で割り切れる文字列の数を計算する必要があります。これは2ステップの問題であり、たとえば、コードを1ステップずつ実行して解決する必要があります。

>

入力

str = "80"

出力

2

入力

str = "7675636788"

出力

15

解決策を見つけるためのアプローチ

最後の3桁の数字のみが8で割り切れ、3で割り切れる数字の合計は8で割り切れます。

次に、文字列のプレフィックス合計を格納して、プレフィックスモジュール3の桁の合計が0、1、または2になるようにします。次に、文字列がiのすべての位置に対して繰り返されます。次に、8で割り切れるiの部分文字列の数を数えます。ここで、この値から3で割り切れるiの部分文字列の数を差し引きます。

| S | X 3サイズの2D配列が定義されています、| S |文字列のサイズです。たとえば、dp[i][j]です。

任意のインデックスでidp[i][j]。インデックスiから0まで、サブストリングの数は出力jを持ちます。したがって、モジュール3以降、0 <=j<=0です。

文字列を繰り返し処理して、1桁、2桁、および3桁の数値が8で割り切れるかどうかを確認する必要があります。

  • 文字がインデックスで8であるかどうかを判断するには、インデックスで番号を確認します。

  • 2桁の場合は、数値を3ではなく8で割ります。

数値が8で割り切れると仮定します。8で割り切れる場合は2つの部分文字列が必要です。ただし、8で割り切れる部分文字列もあります。

#include <bits/stdc++.h>
using namespace std;

#define MAX 1000
int count (char s[], int len) {
   int cur = 0,
   dig = 0;
   int sum[MAX], dp[MAX][3];
   memset (sum, 0, sizeof (sum));
   memset (dp, 0, sizeof (dp));
   dp[0][0] = 1;
   for (int i = 1; i <= len; i++) {
      dig = int (s[i - 1]) - 48;
      cur += dig;
      cur %= 3;
      sum[i] = cur;
      dp[i][0] = dp[i - 1][0];
      dp[i][1] = dp[i - 1][1];
      dp[i][2] = dp[i - 1][2];
      dp[i][sum[i]]++;
   }
   int ans = 0, dprev = 0, value = 0, dprev2 = 0;
   for (int i = 1; i <= len; i++) {
      dig = int (s[i - 1]) - 48;
      if (dig == 8) ans++;
      if (i - 2 >= 0) {
         dprev = int (s[i - 2]) - 48;
         value = dprev * 10 + dig;
         if ((value % 8 == 0) && (value % 3 != 0)) ans++;
      }
      // Taking 3 digit number.
      if (i - 3 >= 0){
         dprev2 = int (s[i - 3]) - 48;
         dprev = int (s[i - 2]) - 48;
         value = dprev2 * 100 + dprev * 10 + dig;
         if (value % 8 != 0) continue;
            ans += (i - 2);
         ans -= (dp[i - 3][sum[i]]);
      }
   }
   return ans;
}
int main () {
   char str[] = "7675636788";
   int len = strlen (str);
   cout << count (str, len) << endl;
   return 0;
}

出力

4

結論

この問題では、c ++コードとともに、3ではなく8で割り切れる部分文字列の数を見つける方法を学びました。このコードは、Java、Python、およびその他の言語で作成することもできます。この問題を解決するために、文字列を逆にして、8で割り切れるが、3で割り切れない部分文字列の数を見つけました。2つの部分に分割すると、非常に簡単な問題になります。


  1. C ++で多数が2、3、5で割り切れるかどうかを確認します

    ここでは、数値が2、3、5で割り切れるかどうかを確認する方法を説明します。この場合、その数は非常に多い数です。したがって、数値を文字列として入力します。 数値が2、3、5のLCMで割り切れる場合、その数値は2、3、5で割り切れます。したがって、2、3、5のLCMは30です。数値が30で割り切れるかどうかを確認する必要があります。数値は、10で割り切れる(最後の桁が0)ときは30で割り切れる、3で割り切れる(すべての桁の合計は3で割り切れる) 例 #include <bits/stdc++.h> using namespace std; bool isDiv30(string nu

  2. C++で多数が11で割り切れるかどうかを確認します

    ここでは、数値が11で割り切れるかどうかを確認する方法を説明します。この場合、その数は非常に多い数です。したがって、数値を文字列として入力します。 数値が11で割り切れるかどうかを確認するには、奇数の位置の値の合計と偶数の位置の値の合計が同じである場合、その数値は11で割り切れます。 例 #include <bits/stdc++.h> using namespace std; bool isDiv11(string num){    int n = num.length();    long odd_sum = 0, even_sum =