n番目の要求数割り切れる複数であります

すご腕コード1201醜い番号III。

見つけるためのプログラム書く  n番目の醜い番号を。

醜い数字は割り切れるある正の整数である  a か、  b または  c

例1:

入力:N = 3、= 2、B = 3、C = 5 
出力:4 
説明:醜い番号が2、3、4、5、6、8、9、10 ...ている3は4です。

例2:

入力:N = 4 = 2、B = 3、C = 4 
出力:6 
説明:醜い番号が2、3、4、6、8、9、12 ...ている4は6です。

例3:

入力:N = 5、= 2、B = 11、C = 13 
出力:10 
説明:醜い番号2、4、6、8、10、11、12、13 ...ている5は10です。

例4:

INPUT:= N-1000000000、A = 2、B = 217 983 653 336 916 467 Cは= 
出力:1999999984 
:リファレンス
議論でleetcode [1]:https://leetcode.com/problems/ugly-number-iii/discuss/387539/cpp-検索-と-バイナリピクチャー-バイナリ検索とテンプレート
[2]ユークリッドの互除法最大公約数:https://www.cnblogs.com/kirito-c/p/6910912.html(与えられましたエラーコードGCD)
と題する:シークは、n AまたはBまたはC割り切れるの正の整数とすることができます。
翻訳:argmin_N F(N)を求めて、F( N)は= またはB、またはCがN、カウント数、F(N)== N未満、分割することができる
F(a)は=となるように、さらに同様のF(B)、F(C割り切れるNの数よりも少ない数 )。その結果、G(a、b)はA、B、最小公倍数。
タイトルは、次になる:argmin_N F(N)、F - F(G(B)) - F(G(C))(N)は、F(A)+ F(B)+ F(C)= - F(G(B、C ))+ F(G(A、B、C))、F(N)== N
海賊説明するための図:A = F(A)、B = F(B)などが挙げられます。

 

 

 

 この場合、2つの質問が含まれます。

F 1は、Nよりも少ない数がによって(a)の数割り切れることができる方法を見つけますか?

2.方法(B)とB、Gの最小公倍数を見つけますか?

:全てで割り切れる数であることができる。1. N /、P *はAのように表現されてもよく、pは正の整数です。NはPのF(A)の可能な値として表現される数より少ない全*数、及びN / 1〜pの値。したがって、答えはN / Aです

2. *のB / Aのように最大公約数bを計算最小公倍数。ユークリッドアルゴリズムによる最大公約数はユークリッドアルゴリズムを解決するために、つまり、することができます。

次のように一般的に理解さ:小の多数及び数bが存在する場合、%Bは== 0の場合、bがaとbの最大公約数です。

!場合%B = 0、*はB + R、R =(Sがあり、tは、Bの除数であり、Rは剰余であり、= Sは* T、B = UがTを* = Qを仮定 - Q * U)*さt、tは数の除数が残りAおよびBであることを示しています。したがって、BとRの最大公約数は、aとbの最大公約数です。そのような再帰は、余りが0である時には、除数は最大公約数です。

コードは次のように記述することができます。

    int型GCD(INT A、INT B){ 
        int型R = 0。
        (B){一方
            、R =%のB; 
            = B; 
            B = R。
        } 
        を返します。
    }

計算されたFおよびGを取得した後、最小のN F(N)==のn個の条件を見つけることができます。すなわち、M> = N場合、F(M)> = F(N)がある、F(N)は単調関数で見ることができます。

これは、順序付けられたアレイにn個の要素の値を見つけるためにインデックスに類似しています。F(N)は、Nがそのインデックスである、配列です。そのため、あなたはバイナリ検索を使用することができます。

insomniacatは  、バイナリサーチのための基本的なフレームワークを提供します。

一方(LO <HI){ 
int型ミッド= + LO(HI - LO)/ 2。
(オプション)(特別条件が渡される)の場合:
	半ばを返します。
(条件が渡された)場合は
  、HI =ミッド; 
他の
  LO =ミッド+ 1; 
} 
LOを返します。

 

最終的なコード:

クラスソリューション{ 
パブリック:
    INT nthUglyNumber(整数nは、INTのB、INT C INT){ 
        int型LO = 1、HI = 2 *(INT)1E9。
        長いA = A、B = B、C = C。
        長いAB = A * B / GCD(A、B)。
        長いAC = A * C / GCD(A、C)。
        長いBC =のB * C / GCD(B、C)。
        長いABC = A * BC / GCD(A、BC)。
        一方(LO <HI){ 
            int型ミッド=(HI - LO)/ 2 + LO。
            // F(N)を計算
            ミッド/ AB - -ミッド/ AC -長いFN =ミッド/ A +ミッド/ B +ミッド/ Cミッド/ BC +ミッド/ ABCを、
            (FN <N)の場合
                LO =ミッド+ 1。
            他の
                ハイテク=ミッド; 
    }
        }
        LOを返します。
    
    int型GCD(長い、長いB){ 
        int型のR。
        (B){一方
            、R =%のB; 
            = B; 
            B = R。
        } 
        を返します。
    } 
}。

  

おすすめ

転載: www.cnblogs.com/vimery/p/11569723.html