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

数nを1にするために必要な最小操作数をカウントするC++プログラム


数nがあるとします。これらの操作のいずれかを任意の回数実行します-

  • nが2で割り切れる場合は、nをn/2に置き換えます

  • nが3で割り切れる場合は、nを2n/3に置き換えます

  • nが5で割り切れる場合は、nを4n/5に置き換えます

1番にするために必要な最小移動数を数える必要があります。不可能な場合は、-1を返します。

したがって、入力がn =10の場合、出力は4になります。これは、n / 2を使用して5を取得し、4n / 5を使用して4を取得し、次にn / 2を使用して2を取得し、n/2を再度使用して取得するためです。 1.

ステップ

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

 m:=0 nが1に等しくない場合、次のようにします。n mod 2が0と同じ場合、n:=n / 2(mを1増やします)それ以外の場合、n mod 3が0と同じ場合、 :n:=n / 3 m:=m + 2それ以外の場合、n mod 5が0と同じ場合、次のようになります。 / pre> 

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

 #include usingnamespace std; intsolve(int n){int m =0; while(n!=1){if(n%2 ==0){n =n / 2; m ++; } else if(n%3 ==0){n =n / 3; m + =2; } else if(n%5 ==0){n =n / 5; m + =3; } else {m =-1;壊す; }} return m;} int main(){int n =10; cout < 

入力

 10 

出力

 4 

  1. サイズdで作成できる十二角形の数をカウントするC++プログラム

    数dがあるとします。正方形のタイルと辺の長さが1の通常の三角形のタイルが無数にあると考えてください。これらのタイルを使用して、側面dの通常の十二角形(12辺の多角形)を形成できる方法をいくつ見つける必要があります。答えが大きすぎる場合は、結果mod998244353を返します。 ステップ これを解決するために、次の手順に従います- b := floor of d/2 - 1 c := 1 for initialize i := 2, when i < d, update (increase i by 1), do:    b := b * (floor of

  2. C++でバイナリ行列をゼロ行列に変換する演算の数をカウントするプログラム

    バイナリ行列があるとします。ここで、1つのセルを取得し、そのセルとそのすべての隣接セル(上、下、左、右)を反転する操作について考えてみます。行列に0のみが含まれるように、必要な操作の最小数を見つける必要があります。解決策がない場合は、-1を返します。 したがって、入力が次のような場合 0 0 1 0 その場合、出力は3になります。 これを解決するには、次の手順に従います- サイズの配列ディレクトリを定義します:4 x 2:={{1、0}、{0、1}、{-1、0}、{0、-1}} const int inf =10 ^ 6 関数getP