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

C++でのステッピング番号


低と高の2つの整数があるとすると、[低、高]の範囲内のすべてのステッピング番号のソートされたリストを見つけて表示する必要があります。ステッピング番号は整数であり、隣接するすべての数字の絶対差が正確に1であることを意味します。たとえば、321はステッピング番号ですが、421はそうではありません。したがって、入力がlow:=0およびhigh:=21のようである場合、結果は[0,1,2,3,4,5,6,7,8,9,10,12,21]になります。

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

  • 1つのアレイ一時を作成
  • solve()という1つのメソッドを作成します。これには、high、seed、lenが必要です。 lenは最初は0です
  • シードが>高い場合は、戻ります
  • シードを一時配列に挿入します
  • シードが0の場合、
    • 1〜9の範囲のiについて、solve(high、i、1)を実行します
  • それ以外の場合
    • lastDigit:=seed mod 10
    • lastDigit>=1かつlen+1 <=10の場合、solve(high、(seed * 10)+ lastDigit – 1、len + 1)
    • lastDigit<=8かつlen+1 <=10の場合、solve(high、(seed * 10)+ lastDigit + 1、len + 1)
  • 主な方法は次のようになります-
  • Solve(high、0、0)
  • 一時配列を並べ替える
  • 1つの配列を作成します
  • 0から一時サイズの範囲のiの場合– 1
    • temp [i]> =lowの場合、temp[i]をansに挿入します
  • 回答を返す

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
typedef long long int lli;
class Solution {
public:
   vector <lli> temp;
   void solve(int high,lli seed=0, int len =0){
      if(seed>high){
         return;
      }
      temp.push_back(seed);
      if(!seed){
         for(int i =1;i<=9;i++){
            solve(high,i,1);
         }
      } else {
         int lastDigit = seed%10;
         if(lastDigit>=1 && len+1<=10)
            solve(high, (seed*10) + lastDigit-1,len+1);
         if(lastDigit<=8 && len+1<=10)
         solve(high, (seed*10) + lastDigit+1,len+1);
      }
   }
   vector<int> countSteppingNumbers(int low, int high) {
      solve(high);
      sort(temp.begin(),temp.end());
      vector <int> ans;
      for(int i =0;i<temp.size();i++){
         if(temp[i]>=low)ans.push_back(temp[i]);
      }
      return ans;
   }
};
main(){
   Solution ob;
   print_vector(ob.countSteppingNumbers(0,40));
}

入力

0
40

出力

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 21, 23, 32, 34, ]

  1. C++でのエマープ番号

    エマープ numberは特殊なタイプの数であり、その数字を逆にすると別の素数が作成されます(この素数は元の素数とは異なります)。 エマープは素数の逆です。 エマープではないいくつかの素数は、回文素数と1桁の素数です。 いくつかのエマープ番号 13、17、37、733です。 n未満のすべてのエマープ数を出力するプログラム。 ここでは、番号nが与えられており、すべてのemirp番号を出力する必要があります。 n以下。 問題を理解するために例を見てみましょう 入力: n =40 出力: 13、17、31、37 ソリューションアプローチ 指定された数よりも小さいすべてのエマー

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

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