কম্পিউটার টিউটোরিয়াল

পাইথনে A-দ্বারা বিভাজ্য এবং অঙ্কের যোগফল B হয় এমন ন্যূনতম ধনাত্মক পূর্ণসংখ্যা

দুটি সংখ্যা A এবং B দেওয়া থাকলে, ন্যূনতম ধনাত্মক সংখ্যা M খুঁজে বের করতে হবে যাতে M, A-দ্বারা বিভাজ্য হয় এবং M-এর অঙ্কগুলোর যোগফল B-এর সমান হয়। যদি এমন কোনো সংখ্যা না থাকে, তবে -1 ফেরত দিন।

উদাহরণ

ইনপুট: A = 50, B = 2

আউটপুট: 200 (কারণ 200 ÷ 50 = 4 এবং 2+0+0 = 2)

সমাধানের পদ্ধতি

  1. BFS (Breadth-First Search) ব্যবহার করে সমাধান করা হয়।
  2. প্রতিটি অবস্থা (state) হিসেবে (অবশিষ্ট, অঙ্কের_যোগফল, সংখ্যা_স্ট্রিং) রাখা হয়।
  3. শুরুতে (0, 0, "") থেকে শুরু করা হয়।
  4. প্রতিটি ধাপে ০ থেকে ৯ পর্যন্ত অঙ্ক যোগ করে নতুন অবস্থা তৈরি করা হয়।
  5. যদি কোনো অবস্থায় অবশিষ্ট ০ এবং অঙ্কের যোগফল B হয়, তবে সেটিই উত্তর।
  6. ভিজিটেড অ্যারের মাধ্যমে পুনরাবৃত্তি এড়ানো হয়।

পাইথন কোড

visited = [[0 for _ in range(501)] for _ in range(5001)]

class Element:
    def __init__(self, a, b, string):
        self.a = a
        self.b = b
        self.string = string

def get_number(a, b):
    que = []
    elem = Element(0, 0, "")
    visited[0][0] = 1
    que.append(elem)
    
    while len(que) > 0:
        temp_elem = que.pop(0)
        if temp_elem.a == 0 and temp_elem.b == b:
            return int(temp_elem.string)
        
        for i in range(10):
            x = (temp_elem.a * 10 + i) % a
            y = temp_elem.b + i
            if y <= b and visited[x][y] == False:
                visited[x][y] = 1
                que.append(Element(x, y, temp_elem.string + str(i)))
    
    return -1

a, b = 50, 2
print(get_number(a, b))

ইনপুট

50, 2

আউটপুট

200
  1. পাইথনে N টি ক্যান্ডি কিনতে ন্যূনতম ও সর্বোচ্চ খরচ নির্ণয়

  2. পাইথনে দুটি অ্যারে থেকে সমান সম্বলিত সাবঅ্যারে খুঁজে বের করা

  3. পাইথনে gcd(N^M, N&M) সর্বাধিক করার জন্য ধনাত্মক M খুঁজুন

  4. পাইথনে পান্ডাজ এবং এর নির্ভরতাগুলোর ভার্সন খুঁজে বের করা