কম্পিউটার

m দ্বারা বিভাজ্য এবং C++ এ জোড় অবস্থানে d সংখ্যা বিশিষ্ট একটি পরিসরে সংখ্যার গণনা


আমাদেরকে একটি পূর্ণসংখ্যা পরিসীমা দেওয়া হয়েছে, একটি চলক m যা ভাজক হিসাবে ব্যবহৃত হয় এবং একটি চলক d যা 'd' সংখ্যাটি জোড় অবস্থানে আছে কিনা তা পরীক্ষা করতে ব্যবহৃত হয় এবং কাজটি হল একটি সংখ্যায় সেই সংখ্যাগুলির গণনা করা। পরিসীমা যা চলক m দ্বারা বিভাজ্য এবং সমান অবস্থানে ডিজিট আছে।

উদাহরণস্বরূপ

ইনপুট - int start =20, end =50, d =8 এবং m =4

আউটপুট - m দ্বারা বিভাজ্য এবং জোড় অবস্থানে d সংখ্যা বিশিষ্ট একটি পরিসরে সংখ্যার সংখ্যা হল:2

ব্যাখ্যা - পরিসরটি 20 থেকে 50 পর্যন্ত শুরু হয়। সুতরাং d সংখ্যা অর্থাৎ 8 সহ সম্ভাব্য সংখ্যাগুলি হল 28, 38 এবং 48 যার জোড় অবস্থানে 8 আছে অর্থাৎ 2 এবং সংখ্যাগুলি 24 এবং 48 m অর্থাৎ 4 দ্বারা বিভাজ্য তাই গণনা হল 2৷

ইনপুট - int start =10, end =100, d =6 এবং m =2

আউটপুট - m দ্বারা বিভাজ্য এবং জোড় অবস্থানে d সংখ্যা বিশিষ্ট একটি পরিসরে সংখ্যার সংখ্যা হল:8

ব্যাখ্যা - পরিসরটি 10 ​​থেকে 100 পর্যন্ত শুরু হয়। সুতরাং d সংখ্যা সহ সম্ভাব্য সংখ্যা যেমন 6, 16, 26, 36, 46, 56, 66, 76, 86 এবং 96 সংখ্যা 6 এবং 66 ব্যতীত জোড় অবস্থানে 6 রয়েছে বিজোড় অবস্থান তাই আমরা এটি অন্তর্ভুক্ত করব না এবং এখন আমরা তালিকা থেকে সংখ্যাগুলি পরীক্ষা করব যেগুলি 2 দ্বারা বিভাজ্য তাই সমস্ত সংখ্যা যেমন 16, 26, 36, 46, 56, 76, 86 এবং 96 2 দ্বারা বিভাজ্য তাই গণনা হল 8.

নিম্নলিখিত প্রোগ্রামে ব্যবহৃত পদ্ধতি

  • ভেরিয়েবলের শুরু থেকে ভেরিয়েবলের শেষ পর্যন্ত পূর্ণসংখ্যার একটি পরিসর তৈরি করুন এবং ভেরিয়েবল d এবং m ঘোষণা করুন এবং মানগুলি ইনপুট করুন। আরও প্রক্রিয়াকরণের জন্য ফাংশনে ডেটা পাস করুন।
  • ভেক্টর টাইপের একটি ভেরিয়েবল তৈরি করুন, আসুন vec বলি।
  • স্টার্ট লুপ যতক্ষণ না ভ্যালু ভ্যারিয়েবল স্টার্টের ভিতরে থাকে। এখন, কিছুক্ষণের মধ্যে ভ্যাল % 10 হিসাবে মানটিকে ভেক্টরে পুশ করুন এবং val / 10 হিসাবে সেট করুন৷
  • এসটিএল-এ রিভার্স ফাংশনকে কল করুন vec.begin() এবং vec.end() এর যুক্তি হিসেবে।
  • মেমসেট ব্যবহার করে অ্যারের মানগুলি -1 হিসাবে সেট করুন।
  • সেট_টোটাল (0, 0, 0, vec) ফেরত দিন যা এমন একটি ফাংশন যা পরীক্ষা করবে যে সংখ্যাগুলি d দিয়ে জোড় অবস্থান এবং m দ্বারা বিভাজ্য কিনা
  • সেট_টোটালফাংশনের ভিতরে-:
    • IF স্থানটি একটি ভেক্টরের আকারের সমান তা পরীক্ষা করুন তারপর IF temp =0 পরীক্ষা করুন তারপর 1 দিন বা 0 দিন৷
    • চেক করুন যদি arr[place][temp][val] -1 এর সমান না হয় তারপর arr[place][temp][val]-এ মান দিন।
    • IF জায়গা % 2 =1 চেক করুন তারপর IF val =0 চেক করুন তারপর IF d vec[place] এর থেকে বড় চেক করুন তারপর 0 দিন
    • ভেরিয়েবল temp_2 ঘোষণা করুন এবং এটিকে 0 এ সেট করুন।
    • দেখুন IF d vec[place] থেকে কম তারপর temp_2 তে 1 সেট করুন।
    • ভেরিয়েবল temp_3 ঘোষণা করুন এবং সেট_টোটাল() এ একটি পুনরাবৃত্ত কল করুন এবং arr[place][temp][val] =temp_3 ফেরত দিন
    • ফলাফল সংরক্ষণ করতে একটি পরিবর্তনশীল গণনা ঘোষণা করুন।
    • একটি পরিবর্তনশীল সেট_সীমা ঘোষণা করুন এবং এটিকে 9 IF val সমান 1 ELSE এ সেট করুন vec[place] দিয়ে।
    • সেট_লিমিট পর্যন্ত i থেকে 0 পর্যন্ত লুপ শুরু করুন এবং চেক করুন যদি আমি d এর সমান তারপর চালিয়ে যান
    • একটি ভেরিয়েবলকে temp_2 হিসাবে ঘোষণা করুন এবং এটিকে ভ্যালে সেট করুন
    • যদি আমি vec[স্থান] এর চেয়ে কম তা পরীক্ষা করুন তারপর temp_2 কে 1 হিসাবে সেট করুন
    • সেট_টোটাল ফাংশনে পুনরাবৃত্ত কলের সাথে গণনা সেট করুন
    • রিটার্ন arr[place][temp][val] =গণনা।

উদাহরণ

#include <bits/stdc++.h>
using namespace std;

int arr[20][20][2];
int d, m;

int set_total(int place, int temp, int val, vector < int > vec) {
   if (place == vec.size()) {
      if (temp == 0) {
         return 1;
      }
      return 0;
   }
   if (arr[place][temp][val] != -1) {
      return arr[place][temp][val];
   }
   if (place % 2) {
      if (val == 0) {
         if (d > vec[place]) {
            return 0;
         }
      }
      int temp_2 = val;
      if (d < vec[place]) {
         temp_2 = 1;
      }
      int temp_3 = set_total(place + 1, (10 * temp + d) % m, temp_2, vec);
      return arr[place][temp][val] = temp_3;
   }
   int count = 0;
   int set_limit = (val ? 9 : vec[place]);
   for (int i = 0; i <= set_limit; i++) {
      if (i == d) {
         continue;
      }
      int temp_2 = val;
      if (i < vec[place]) {
         temp_2 = 1;
      }
      count += set_total(place + 1, (10 * temp + i) % m, temp_2, vec);
   }
   return arr[place][temp][val] = count;
}

int divisible(int val) {
   vector < int > vec;
   while (val) {
      vec.push_back(val % 10);
      val = val / 10;
   }
   reverse(vec.begin(), vec.end());
   memset(arr, -1, sizeof(arr));
   return set_total(0, 0, 0, vec);
}
int main() {
   int start = 20, end = 50;
   d = 8, m = 4;
   int count = divisible(end) - divisible(start);
   cout << "Count of Numbers in a Range divisible by m and having digit d in even positions are: " << count;
   return 0;
}

যদি আমরা উপরের কোডটি চালাই তবে এটি নিম্নলিখিত আউটপুট −

উৎপন্ন করবে

আউটপুট

Count of Numbers in a Range divisible by m and having digit d in even positions are: 2

  1. C++ এ [l, r] পরিসরে ASCII মান সহ বর্ণমালা গণনা করুন এবং মুদ্রণ করুন

  2. O(লগ n) সময় এবং C++ এ O(1) স্থান প্রদত্ত পরিসরে ফিবোনাচি সংখ্যা গণনা করুন

  3. C++ এ একটি প্রদত্ত পরিসরে ফ্যাক্টরিয়াল সংখ্যা গণনা করুন

  4. C++-এ Bitwise AND সংখ্যার পরিসর