Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาจำนวนวิธีที่กำลังสองของจำนวนเท่ากับผลคูณของตัวเลขสองตัวใน Python


สมมติว่าเรามีสองอาร์เรย์ nums1 และ nums2 เราต้องหาแฝดที่ก่อตัวขึ้น (ประเภทที่ 1 และประเภทที่ 2) ตามกฎสองข้อนี้ -

  • แฝดสาม (i, j, k) ถ้า nums1[i]^2 =nums2[j] * nums2[k] โดยที่ [0 <=i <ขนาดของ nums1 และ 0 <=j
  • แฝดสาม (i, j, k) ถ้า nums2[i]^2 =nums1[j] * nums1[k] โดยที่ [0 <=i <ขนาดของ nums2 และ 0 <=j

ดังนั้น หากอินพุตเป็น nums1 =[7,4] nums2 =[5,2,8,9] เอาต์พุตจะเป็น 1 เนื่องจากมีแฝดสามประเภท 1, (1,1,2), nums1 [1]^2 =nums2[1] * nums2[2] =(16 =2*8)

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:

  • cnt1 :=แผนที่สำหรับเก็บแต่ละองค์ประกอบและจำนวน nums1
  • cnt2 :=แผนที่สำหรับเก็บแต่ละองค์ประกอบและจำนวน nums2
  • กำหนดฟังก์ชัน triplets() นี่จะใช้เวลา arr1, arr2
  • ตอบ :=0
  • สำหรับแต่ละ t, v ใน items() ของ arr1, do
    • k :=arr2[t] หากมี มิฉะนั้น 0
    • tmp :=k*(k - 1) / 2
    • sq :=t * t
    • สำหรับแต่ละ m ใน arr2 ทำ
      • ถ้า m
      • tmp :=tmp + (arr2[m] หากมี มิฉะนั้น 0) * (arr2[quotient of sq/m] หากมี มิฉะนั้น 0)
  • ans :=ans + tmp * v
  • คืนสินค้า
  • จากวิธีหลัก ให้ทำดังนี้−
  • ส่งคืนแฝด (cnt1, cnt2) + แฝดสาม (cnt2, cnt1)
  • ตัวอย่าง

    ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น−

    from collections import Counter
    def solve(nums1, nums2):
       cnt1 = Counter(nums1)
       cnt2 = Counter(nums2)
    
       def triplets(arr1, arr2):
          ans = 0
          for t, v in arr1.items():
             k = arr2.get(t, 0)
             tmp = k * (k - 1) // 2
             sq = t * t
             for m in arr2:
                if m < t and sq % m == 0:
                   tmp += arr2.get(m, 0) * arr2.get(sq // m, 0)
                ans += tmp * v
          return ans
    
       return triplets(cnt1, cnt2) + triplets(cnt2, cnt1)
    nums1 = [7,4]
    nums2 = [5,2,8,9]
    print(solve(nums1, nums2))

    อินพุต

    [7,4],[5,2,8,9]

    ผลลัพธ์

    2