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

C++のストロボグラマティックナンバーIII


(低と高)の範囲に存在するストロボグラマティック数の合計をカウントする関数を定義するとします。ストロボグラマティック数は、180度回転したときに同じように見える数であることがわかっています。

したがって、入力がlow ="50"、high ="100"のようである場合、69、88、および96の3つの結果があるため、出力は3になります。

これを解決するには、次の手順に従います-

  • 関数findStrobogrammatic()を定義します。これにはnが必要です

  • 配列retを定義する

  • n&1がゼロ以外の場合、-

    • retの最後に「0」を挿入します

    • retの最後に「1」を挿入します

    • retの最後に「8」を挿入します

  • それ以外の場合

    • retの最後に空白の文字列を挿入します

  • n> 1の場合、n:=n-2を更新し、-

    • アレイの温度を定義する

    • 初期化i:=0の場合、i

      • s:=ret [i]

      • n> 3の場合、-

        • 温度の最後に「0」+s+「0」を挿入します

      • 温度の最後に「1」+s+「1」を挿入

      • 温度の最後に「8」+s+「8」を挿入します

      • 温度の最後に「6」+s+「9」を挿入します

      • 温度の最後に「9」+s+「6」を挿入します

    • ret:=temp

  • retを返す

  • メインの方法から、次のようにします-

  • ret:=0

  • 配列を定義するv

  • 初期化i:=低サイズの場合、i <=高サイズの場合、更新(iを1増やします)、実行-

    • v:=findStrobogrammatic(i)

    • 初期化j:=0の場合、j

      • ret:=ret +(v[j]の長さ>lowの長さとhighの長さ>v [j]の長さの場合は1)

  • retを返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   vector<string> findStrobogrammatic(int n) {
      vector<string> ret;
      if (n & 1) {
         ret.push_back("0");
         ret.push_back("1");
         ret.push_back("8");
      }
      else {
         ret.push_back("");
      }
      for (; n > 1; n -= 2) {
         vector<string> temp;
         for (int i = 0; i < ret.size(); i++) {
            string s = ret[i];
            if (n > 3) {
               temp.push_back("0" + s + "0");
            }
            temp.push_back("1" + s + "1");
            temp.push_back("8" + s + "8");
            temp.push_back("6" + s + "9");
            temp.push_back("9" + s + "6");
         }
         ret = temp;
      }
      return ret;
   }
   bool compare(string a, string b){
      return a.size() == b.size() ? a >= b : a.size() > b.size();
   }
   int strobogrammaticInRange(string low, string high) {
      int ret = 0;
      vector<string> v;
      for (int i = low.size(); i <= high.size(); i++) {
         v = findStrobogrammatic(i);
         for (int j = 0; j < v.size(); j++) {
            ret += compare(v[j], low) && compare(high, v[j]);
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout <<(ob.strobogrammaticInRange("50", "100"));
}

入力

"50","100"

出力

3

  1. C++での質素な数

    この問題では、正の整数Nが与えられます。私たちのタスクは、与えられた数が質素な数であるかどうかをチェックするプログラムを作成することです。 不正な番号 −指定された数の素因数分解の桁数よりも厳密に桁数が多い数。 例 − 625、数625の素因数は5 4です。 。 625の桁数は3です。 5 4の桁数 は2です。 3は厳密に2より大きくなります。したがって、625は質素な数です。 最初のいくつかの質素な数は − 125、128、243、256、343、512、625など。 問題を理解するために例を見てみましょう Input: n = 128 Output: Frugal n

  2. C++五胞体数

    五胞体数は、パスカルの三角形の5番目の数として表されます。ご存知のように、これは5番目の数字です。つまり、パスカルの三角形に少なくとも5つの数字が必要です。したがって、このシリーズの最初の数字は 1 4 6 4 1から始まります。 パスカルの三角形の4行目。したがって、このチュートリアルでは、たとえば、n番目の五胞体数を見つける必要があります Input : 1 Output : 1 Input : 4 Output : 35 次の図から出力を確認できます- この問題については、可能な限り、これは一種のシリーズであるため、ソリューションでこのシリーズのパターンを見つけようと