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

Pythonでgcd(N ^ M、N&M)が最大になるような正の数Mを見つけます


数Nがあるとすると、gcd(N ^ M、N&M)が可能な限り大きく、m

したがって、入力が20のような場合、出力は31になります

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

  • bit_count(n)が0と同じ場合、
    • 範囲2からint((n)の平方根)+ 1のiの場合、do
      • n mod iが0と同じ場合、
        • return int(n / i)
  • それ以外の場合、
    • val:=0
    • p:=
    • dupn:=n
    • nがゼロ以外の場合は、
      • (n AND 1)が0と同じ場合、
        • val:=val + p
      • p:=p * 2
      • n:=n>> 1
    • return gcd(val XOR dupn、val AND dupn)
  • 1を返す

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

from math import gcd, sqrt
def bit_count(n):
   if (n == 0):
      return 0
   else:
      return (((n & 1) == 0) + bit_count(n >> 1))
def maximum_gcd(n):
   if (bit_count(n) == 0):
      for i in range(2, int(sqrt(n)) + 1):
         if (n % i == 0):
            return int(n / i)
   else:
      val = 0
      p = 1
      dupn = n
      while (n):
         if ((n & 1) == 0):
            val += p
         p = p * 2
         n = n >> 1
      return gcd(val ^ dupn, val & dupn)
   return 1
n = 20
print(maximum_gcd(n))

入力

20

出力

31

  1. Pythonで最初のN個の自然数の2乗の合計がX以下になるように最大Nを見つけます

    与えられた整数Xがあるとすると、最初のN個の自然数の合計が値Xを超えないように、最大​​値Nを見つける必要があります。 したがって、入力がX =7の場合、2はNの可能な最大値であるため、出力は2になります。N=3の場合、級数の合計はX =7を超えます。したがって、1 ^ 2 + 2 ^ 2 + 3 ^ 2 =1 + 4 +9=14。 これを解決するには、次の手順に従います- 関数sum_of_squares()を定義します。これにはNがかかります res:=(N *(N + 1)*(2 * N + 1))/ 6 解像度を返す メインの方法から、次のようにします-

  2. Pythonで数値の複合被加数の最大数を見つける

    指定された数Nがあり、範囲(1 <=N <=10 ^ 9)の場合、Nを可能な最大数の複合被加数の合計として表す必要があります。この最大数を返します。それ以外の場合、分割が見つからない場合は、-1を返します。 したがって、入力が16の場合、出力は4になります。16は4 + 4 + 4+4または8+8と書くことができますが、(4 + 4 + 4 + 4)には最大の被加数があります。 これを解決するには、次の手順に従います- max_val:=16 関数pre_calc()を定義します。これには時間がかかります table:=サイズmax_valのリスト、各位置に-1を格納