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

C++の醜い番号III


n番目の醜い数を見つけるプログラムを書かなければならないとしましょう。醜い数は、aまたはbまたはcで割り切れる正の整数です。したがって、たとえば、n=3およびa=2、b=3およびc=5の場合、醜い数は[2,3,4,5,6,8,9,10]であるため、出力は4になります。 、3番目は4です。

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

  • ok()というメソッドを作成します。これには、x、a、b、cが必要です。これは、以下のように動作します-

  • return(x / a)+(x / b)+(x / c)–(x / lcm(a、b))-(x / lcm(b、c))-(x / lcm(b、c) )-(x / lcm(a、c))+(x / lcm(a、lcm(b、c)))

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

  • 低:=1、高:=2 *(10 ^ 9)

  • 低<高-

    • 中:=低+(高-低)/ 2

    • x:=ok(mid、a、b、c)

    • x> =nの場合、high:=mid、それ以外の場合、low:=mid + 1

  • ハイに戻る

例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
   lli gcd(lli a, lli b){
      return b == 0? a: gcd(b, a % b);
   }
   lli lcm(lli a, lli b){
      return a * b / gcd(a, b);
   }
   lli ok(lli x, lli a, lli b, lli c){
      return (x / a) + (x / b) + (x / c) - (x / lcm(a, b)) - (x / lcm(b, c)) - (x / lcm(a, c)) + (x / lcm(a, lcm(b, c)));
   }
   int nthUglyNumber(int n, int a, int b, int c) {
      int low = 1;
      int high = 2 * (int) 1e9;
      while(low < high){
         int mid = low + (high - low) / 2;
         int x = ok(mid, a, b, c);
         if(x>= n){
            high = mid;
         }
         else low = mid + 1;
      }
      return high;
   }
};
main(){
   Solution ob;
   cout << (ob.nthUglyNumber(3,2,3,5));
}

入力

3
2
3
5

出力

4

  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 次の図から出力を確認できます- この問題については、可能な限り、これは一種のシリーズであるため、ソリューションでこのシリーズのパターンを見つけようと