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

C++-এ বড় সংখ্যার রোটেশন গুলোর মধ্যে ৮ দিয়ে বিভাজ্য কতটি আছে তা গণনা


আমাদের একটি বড় সংখ্যা দেওয়া আছে। লক্ষ্য হলো এই সংখ্যার রোটেশন (rotation) গুলোর মধ্যে ৮ দিয়ে বিভাজ্য কতটি আছে তা বের করা।

রোটেশন বারবার করা যাবে না, তাই আমরা ৮ দিয়ে বিভাজ্যতার নিয়ম ব্যবহার করব: শেষ তিনটি ডিজিট যদি ৮ দিয়ে বিভাজ্য হয়, তবে পুরো সংখ্যও ৮ দিয়ে বিভাজ্য। উদাহরণস্বরূপ, ১৮০০ এর রোটেশন গুলো: ১৮০০, ০১৮০, ০০১৮, ৮০০১। এর মধ্যে ১৮০০, ৮ দিয়ে বিভাজ্য।

উদাহরণ দিয়ে বুঝি

ইনপুট − num=15320

আউটপুট − ৮ দিয়ে বিভাজ্য রোটেশন সংখ্যা: ১

ব্যাখ্যা − রোটেশন গুলো: ১৫৩২০, ০১৫৩২, ২০১৫৩, ৩২০১৫, ৫৩২০১। এর মধ্যে শুধু ১৫৩২০, ৮ দিয়ে বিভাজ্য।

ইনপুট − num=848484

আউটপুট − ৮ দিয়ে বিভাজ্য রোটেশন সংখ্যা: ৩

ব্যাখ্যা − রোটেশন গুলো: ৮৪৮৪৮৪, ৪৮৪৮৪৮, ৮৪৮৪৮৪, ৪৮৪৮৪৮, ৮৪৮৪৮৪, ৪৮৪৮৪৮। সব ৪৮৪৮৪৮ গুলো ৮ দিয়ে বিভাজ্য।

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

সংখ্যাকে স্ট্রিং-এ কনভার্ট করে লুপ দিয়ে ঘুরব। প্রতিটি তিন ডিজিটের জোড়াকে ইন্টিজারে কনভার্ট করে ৮ দিয়ে বিভাজ্যতা চেক করব। বিভাজ্য হলে কাউন্ট বাড়াব।

  • সংখ্যা long long num হিসেবে নিন।
  • Rotation_8(long long num) ফাংশন সংখ্যা নিয়ে ৮ দিয়ে বিভাজ্য রোটেশন কাউন্ট রিটার্ন করে।
  • স্ট্রিং-এ কনভার্ট করুন: str = to_string(num)।
  • ডিজিট সংখ্যা: length = str.length()।
  • তিন ডিজিটের ইন্টিজার মান রাখার জন্য digit=0, কাউন্টের জন্য count=0।
  • যদি length == 1: একক ডিজিটকে ইন্টিজারে কনভার্ট করে ৮ দিয়ে বিভাজ্যতা চেক করুন, ১ বা ০ রিটার্ন করুন।
  • যদি length == 2: দুটি ডিজিটের দুটি রোটেশন বানান, ৮ দিয়ে বিভাজ্যতা চেক করুন, কাউন্ট রিটার্ন করুন।
  • অন্যথায় (৩ বা অধিক ডিজিট): i=0 থেকে length-1 পর্যন্ত লুপে তিন ক্যারেক্টারকে ইন্টিজারে কনভার্ট করুন: digit = (str[i]-'0')*100 + (str[i+1]-'0')*10 + (str[i+2]-'0')। ৮ দিয়ে বিভাজ্য হলে কাউন্ট বাড়ান।
  • শেষ ডিজিট এবং প্রথম দুটি ডিজিট দিয়ে বানানো জোড়াও চেক করুন।
  • শেষে count রিটার্ন করুন।

উদাহরণ

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

int Rotation_8(long long num) {
    string str = to_string(num);
    int length = str.length();
    int digit = 0, count = 0;
    if (length == 1) {
        digit = str[0] - '0';
        if (digit % 8 == 0) return 1;
        else return 0;
    }
    else if (length == 2) {
        int part_1 = (str[0] - '0') * 10 + (str[1] - '0');
        int part_2 = (str[1] - '0') * 10 + (str[0] - '0');
        if (part_1 % 8 == 0) count++;
        if (part_2 % 8 == 0) count++;
        return count;
    }
    else {
        for (int i = 0; i < (length - 2); i++) {
            digit = (str[i] - '0') * 100 + (str[i + 1] - '0') * 10 + (str[i + 2] - '0');
            if (digit % 8 == 0) count++;
        }
    }
    digit = (str[length - 1] - '0') * 100 + (str[0] - '0') * 10 + (str[1] - '0');
    if (digit % 8 == 0) count++;
    digit = (str[length - 2] - '0') * 100 + (str[length - 1] - '0') * 10 + (str[0] - '0');
    if (digit % 8 == 0) count++;
    return count;
}

int main() {
    long long num = 24040;
    cout << "Count of rotations divisible by 8 are: " << Rotation_8(num);
    return 0;
}

আউটপুট

Count of rotations divisible by 8 are: 3
  1. সাব-ম্যাট্রিক্সের সম k দিয়ে বিভাজ্য হলে তাদের সংখ্যা গণনা (C++)

  2. সাবঅ্রে যার গুণফল k দিয়ে বিভাজ্য C++-এ

  3. C++-এ বড় সংখ্যার রোটেশন গুলোর মধ্যে ৪ দিয়ে বিভাজ্য কতটি আছে তা গণনা

  4. C++-এ সর্টেড ও রোটেটেড লিংকড লিস্টে রোটেশনের সংখ্যা গণনা