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

C ++では、その中の数字とqの積が等しくないような範囲の数値を数えます


範囲変数として開始と終了の2つの数値が与えられ、入力として整数qが与えられます。目標は、数値とそのqの積に共通の数字がないような範囲内の数値を見つけることです。

数値が5でqが3の場合、積は15になります。5と15の両方に共通の数字5があります。

数値が2でqが5の場合、積は10になります。2と10の両方に共通の数字はありません。

例を挙げて理解しましょう。

入力- 開始=5、終了=10、q =2

出力- その中の数字とqを含むその積が等しくないような範囲内の数の数は次のとおりです:5

説明- 番号は次のようになります:

  • 5(5 * 2 =10)
  • 6(6 * 2 =12)
  • 7(7 * 2 =14)
  • 8(8 * 2 =16)
  • 9(9 * 2 =18)

入力- 開始=20、終了=25、q =5

出力- その中の数字とqの積が等しくないような範囲内の数の数は次のとおりです:2

説明- 番号は次のようになります:

  • 22(22 * 5 =110)
  • 23(23 * 5 =115)

以下のプログラムで使用されているアプローチは次のとおりです

このアプローチでは、最初から最後までトラバースし、各数値とqを含むその積を文字列に変換します。次に、現在の数の文字数を格納する配列arr[26]を作成します。ここで、積の文字列(現在の番号* q)をトラバースし、その文字列のいずれかの文字のarr []の値がゼロ以外の場合は一般的であるため、0を返します。それ以外の場合は1を返します。

  • 範囲変数と値qを取得します。
  • 関数check(int i、int q)は、数値iとqを取り、iとqの桁が等しくないか、一般的でない場合は1を返します。
  • str =to_string(i)を使用してiを文字列に変換します。
  • str_2 =to_string(temp)を使用して、製品(temp =q * i)をstingに変換します。
  • strの文字数をカウントするために頻度配列arr[26]={0}を取得します。
  • forループを使用してstrをトラバースし、arr [str[j]-'0']++を使用して頻度を更新します。
  • forループを使用してstr_2をトラバースし、arr [str_2[j]-'0']がゼロ以外であるかどうかを確認します。ゼロ以外の場合は一般的です。 0を返します。
  • それ以外の場合は1を返します。
  • 関数unequal(int start、int end、int q)は、範囲変数とqを受け取り、範囲内の桁数とqとの積が等しくないような範囲内の数値の数を返します。
  • 初期カウントを0とします。
  • i-startからi=endまでのforループを使用して数値をトラバースします。
  • check(i、q)を使用して、番号iとそのqの積に共通の数字がないかどうかを調べます。はいの場合、カウントをインクリメントします。
  • 最後に結果としてカウントを返します。

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

int check(int i, int q) {
   string str = to_string(i);
   int length = str.size();
   int arr[26] = {
      0
   };

   int temp = i * q;
   string str_2 = to_string(temp);
   int length_2 = str_2.size();
   for (int j = 0; j < length; j++) {
      arr[str[j] - '0']++;
   }
   for (int j = 0; j < length_2; j++) {
      if (arr[str_2[j] - '0']) {
         return 0;
      }
   }
   return 1;
}

int unequal(int start, int end, int q) {
   int count = 0;

   for (int i = start; i <= end; i++) {
      if (check(i, q)) {
         count++;
      }
   }
   return count;
}
int main() {
   int start = 20, end = 40, q = 4;
   cout << "Count of numbers in range such that digits in it and it's product with q are unequal are: " << unequal(start, end, q);
   return 0;
}

上記のコードを実行すると、次の出力が生成されます-

出力

Count of numbers in range such that digits in it and it's product with q are unequal are: 1

  1. C++で一意の桁を持つ数を数える

    非負の整数nがあるとします。一意の数字xを持つすべての数値をカウントする必要があります。xは0〜10^nの範囲です。したがって、数値nが2の場合、11、22、33、44、55、66、77、88、99なしで0から100までの数値を検索するため、結果は91になります。 これを解決するには、次の手順に従います- nが0の場合、1を返します n:=最小10およびn nが1の場合、10を返します ans:=9およびret:=10 2からnの範囲のiの場合 ans:=ans *(9 – i + 2) ret:=ret + ans retを返す

  2. C++での数値範囲のビットごとのAND

    範囲[m、n]があり、0 <=m <=n<=2147483647であるとします。この範囲内のすべての数値のビットごとのANDを見つける必要があります。したがって、範囲が[5、7]の場合、結果は4になります。 これを解決するには、次の手順に従います- i:=0 mがnでない場合、 m:=m / 2、n:=n / 2、iを1増やします 左にi回シフトした後、mを返します。 例(C ++) 理解を深めるために、次の実装を見てみましょう- #include <bits/stdc++.h> using namespace std; class Soluti