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

C++で連続するものがない非負の整数


正の整数nがあるとします。 n以下の非負の整数を見つける必要があります。制約は、バイナリ表現に連続した表現が含まれないことです。したがって、入力が7の場合、5のバイナリ表現は101であるため、答えは5になります。

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

  • 関数convert()を定義します。これにはnが必要です。
  • ret:=空の文字列
  • nがゼロ以外の場合、-
      を実行します。
    • ret:=ret +(n mod 2)
    • n:=右シフトn、1回
  • return ret
  • メインの方法から、次の手順を実行します-
  • ビット:=関数convert(num)を呼び出す
  • n:=ビットのサイズ
  • サイズnの配列0を定義し、サイズnの配列0を定義します
  • ones [0]:=1、zeroes [0]:=1
  • iを初期化する場合:=1、i
  • zeroes [i]:=zeroes [i-1] + ones [i-1]
  • ones [i]:=zeroes [i-1]
  • ret:=ones [n-1] + zeroes [n-1]
  • iを初期化する場合:=n-2、i> =0の場合、更新(iを1つ減らす)、実行-
    • ビット[i]が「0」と同じで、ビット[i + 1]が「0」と同じ場合、-
      • ret:=ret --ones [i]
    • それ以外の場合、bits[i]が'1'と同じで、bits [i + 1]が'1'と同じ場合、-
      • ループから抜け出す
  • return ret
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       string convert(int n){
          string ret = "";
          while(n){
             ret += (n % 2) + '0';
             n >>= 1;
          }
          return ret;
       }
       int findIntegers(int num) {
          string bits = convert(num);
          int n = bits.size();
          vector <int> ones(n);
          vector <int> zeroes(n);
          ones[0] = zeroes[0] = 1;
          for(int i = 1; i < n; i++){
             zeroes[i] = zeroes[i - 1] + ones[i - 1];
             ones[i] = zeroes[i - 1];
          }
          int ret = ones[n - 1] + zeroes[n - 1];
          for(int i = n - 2; i >= 0; i--){
             if(bits[i] == '0' && bits[i + 1] == '0') ret -= ones[i];
             else if(bits[i] == '1' && bits[i + 1]== '1') break;
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       cout << (ob.findIntegers(7));
    }

    入力

    7

    出力

    5

    1. C++で2つの整数を除算する

      2つの整数の被除数と除数があるとします。乗算、除算、モジュロ演算子を使用せずに2つの整数を除算する必要があります。被除数を除数で割った後、商を返します。整数除算はゼロに向かって切り捨てる必要があります。両方の入力は整数です したがって、与えられた入力が被除数=7、除数=-3の場合、出力は-2になります。 これを解決するには、次の手順に従います- 2つの引数xとyを取ると、xがyを除算することを示します x<-Infinityおよびy=1の場合、無限大を返します a:=| x |、b:=| y |およびans:=0 =0 p:=0 =0 p:=p + 1 a:=a

    2. C++で3つの連続する整数の合計として数値を記述できるかどうかを確認します

      このセクションでは、数値をツリーの連続した数値として表すことができるかどうかを確認します。数値が27であるとします。これは、8 + 9+10として表すことができます。 これは、2つの異なるアプローチで解決できます。最初のアプローチはナイーブアプローチです。そのアプローチでは、i +(i + 1)+(i + 2)が数値と同じかどうかを確認する必要があります。もう1つの効率的なアプローチは、数値が3で割り切れるかどうかを確認することです。数xを3つの連続する1で表すことができるとすると、x =(y --1)+ y +(y + 1)=3yとなります。したがって、数値は3で割り切れる必要があります。