Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm xác suất để bất kỳ ước số thích hợp nào của n sẽ là một số bình phương hoàn hảo chẵn trong Python

Giả sử chúng ta có một số n, chúng ta phải tìm xác suất để bất kỳ ước số thích hợp nào của n sẽ là một hình vuông chẵn hoàn hảo.

Vì vậy, nếu đầu vào là n =36, thì đầu ra sẽ là 1/8 vì có tám ước số thích hợp của 36, ​​chúng là {1,2,3,4,6,9,12,18} và trong số đó chỉ có một số (4) là hình vuông hoàn hảo và chẵn.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • nếu n mod 4 không giống 0, thì
    • trả về 0
  • nếu không,
    • nc:=n, ptr:=2
    • l:=một danh sách mới
    • while ptr <=căn bậc hai của nc, do
      • a:=0
      • trong khi nc mod ptr giống 0, do
        • a:=a + 1
        • nc:=tầng của (nc / ptr)
      • nếu a> 0, thì
        • thêm a vào danh sách l
      • ptr:=ptr + 1
    • nếu nc> 1, thì nối 1 vào danh sách l
    • k:=l [0]
    • d:=k + 1
    • no:=tầng của (k / 2)
    • đối với mỗi i trong l [từ chỉ mục 1 đến cuối], thực hiện
      • d:=d * (i + 1)
      • no:=no * tầng của (i / 2) + 1
    • d:=d - 1
    • nếu n là một hình vuông hoàn hảo thì
      • không:=không - 1
    • g:=gcd của d và không
    • d:=tầng của d / g
    • no:=tầng không / g
    • nếu không giống với 0, thì
      • trả về 0
    • nếu không,
      • trả về một phân số không có / d

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

from math import gcd

def solve(n):
   if n % 4 != 0:
      return 0
   else:
      nc = n
      ptr = 2
      l = []
      while ptr <= nc ** 0.5:
         a = 0
         while nc % ptr == 0:
            a += 1
            nc = nc / ptr
         if a > 0:
            l += [a]
         ptr += 1
      if nc > 1:
         l += [1]
      k = l[0]
      d = k + 1
      no = int(k / 2)
      for i in l[1:]:
         d = d * (i + 1)
         no *= int(i / 2) + 1
      d = d - 1
      if int(n ** 0.5) ** 2 == n:
         no -= 1
      g = gcd(d, no)
      d = d // g
      no = no // g
      if no == 0:
         return 0
      else:
         return str(no) + '/' + str(d)

n = 36
print(solve(n))

Đầu vào

4, 27

Đầu ra

1/8