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

ডিজিটের যোগফল নির্দিষ্ট মান সমান হলে সংখ্যা গণনা (Find numbers whose sum of digits equals a value)

একটি সংখ্যা n এবং একটি মান দেওয়া আছে। আমাদের সব n-ডিজিট সংখ্যা খুঁজে বের করতে হবে, যাদের সব ডিজিটের যোগফল s দেওয়া মানের সমান। এখানে ০ কে ডিজিট হিসেবে গণনা করা হয় না।

সংখ্যা n-এর পরিসর ১ থেকে ১০০, এবং মানটির পরিসর ১ থেকে ৫০০ হতে হবে।

ইনপুট এবং আউটপুট

ইনপুট: এই অ্যালগরিদম ডিজিটের সংখ্যা এবং যোগফলের মান নেয়।
ডিজিট কাউন্ট ৩, এবং যোগফল ১৫।
আউটপুট: যোগফল ১৫ হয় এমন ৩-ডিজিট সংখ্যাগুলোর সংখ্যা প্রদর্শন করুন।
ফলাফল: ৬৯। (১৫ যোগফল দিয়ে ৬৯টি ভিন্ন ৩-ডিজিট সংখ্যা রয়েছে)

এলগরিদম

count(digit, sum)

ইনপুট: সংখ্যার ডিজিট, দেওয়া মান।

আউটপুট: কতগুলো সংখ্যা আছে তা গণনা করুন।

শুরু
  যদি digit = 0, তবে
    return true যখন sum = 0
  যদি memTable[digit, sum] খালি না থাকে, তবে
    return memTable[digit, sum]
  answer := 0
  i := 0 থেকে 9 পর্যন্ত, করুন
    যদি sum - i >= 0, তবে
      answer := answer + count(digit - 1, sum - i)
    শর্ত শেষ
  শেষ লুপ
  return memTable[digit, sum] := answer
শেষ

numberCount(digit, sum)

ইনপুট: সংখ্যার ডিজিট, দেওয়া মান।

আউটপুট: কতগুলো সস্ত্র সংখ্যা আছে।

শুরু
  memTable সংজ্ঞায়িত করুন এবং সব স্পেস খালি করুন
  res := 0
  i := 1 থেকে 9 পর্যন্ত, করুন
    যদি sum - i >= 0, তবে
      res := res + count(digit - 1, sum - i)
    শর্ত শেষ
  শেষ লুপ
  return result
শেষ

উদাহরণ (C++ কোড)

#include <iostream>
#define ROW 101
#define COL 501
using namespace std;

unsigned long long int memTable[ROW][COL];

unsigned long long int count(int digit, int sum) {
  if (digit == 0)  // ০ ডিজিট সংখ্যা হলে চেক করুন যোগফল ০ কিনা
    return sum == 0;
  if (memTable[digit][sum] != -1)  // সাবপ্রব্লেম ফলাফল পাওয়া গেলে ফেরত দিন
    return memTable[digit][sum];
  unsigned long long int ans = 0;  // প্রথমবার আンサー ০ সেট করুন
  for (int i = 0; i < 10; i++)  // প্রতিটি ডিজিটের জন্য গণনা করুন এবং সেটি দিয়ে শুরু হওয়া সংখ্যা খুঁজে বের করুন
    if (sum - i >= 0)
      ans += count(digit - 1, sum - i);
  return memTable[digit][sum] = ans;
}

unsigned long long int numberCount(int digit, int sum) {
  for(int i = 0; i < ROW; i++)  // প্রাথমিকভাবে মেমোরাইজেশন টেবিলের সব এন্ট্রি -১
    for(int j = 0; j < ROW; j++)
      memTable[i][j] = -1;
  unsigned long long int result = 0;
  for (int i = 1; i <= 9; i++)  // প্রতিটি ডিজিটের জন্য গণনা করুন এবং সেটি দিয়ে শুরু হওয়া সংখ্যা খুঁজে বের করুন
    if (sum - i >= 0)
      result += count(digit - 1, sum - i);
  return result;
}

int main() {
  int digit, sum;
  cout << "Enter digit count: "; cin >> digit;
  cout << "Enter Sum: "; cin >> sum;
  cout << "Number of values: " << numberCount(digit, sum);
}

আউটপুট

Enter digit count: 3
Enter Sum: 15
Number of values: 69
  1. C++ প্রোগ্রাম: সংখ্যার ডিজিট যোগফল একক ডিজিট হয় পর্যন্ত

  2. C++-এ দৈর্ঘ্য k-এর সাবস্ট্রিং যাদের ASCII মান সমষ্টি k দিয়ে বিভাজ্য তাদের সংখ্যা বের করা

  3. পাইথনে দিয়ে যোগফলের জন্য সর্বোচ্চ গুণফল নির্ণয়

  4. পাইথনে অঙ্ক যোগফল এক অঙ্ক হয় পর্যন্ত করার প্রোগ্রাম