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

C++-এ রাসায়নিক সূত্র থেকে পরমাণু গণনা (Number of Atoms)

একটি রাসায়নিক সূত্র দেওয়া থাকলে, প্রতিটি পরমাণুর সংখ্যা বের করতে হবে।

পরমাণুর নাম সর্বদা বড় হাতের অক্ষর দিয়ে শুরু হয়, এরপর ছোট হাতের অক্ষর থাকতে পারে। সংখ্যা ১-র চেয়ে বড় হলে শুধু তখন ডিজিট থাকে, ১ হলে ডিজিট থাকে না। যেমন: H2O এবং H2O2 বৈধ, কিন্তু H1O2 অবৈধ।

উদাহরণ

ইনপুট: Na2(CO)3 → আউটপুট: C3Na2O3

অর্থ: ৩টি কার্বন (C), ২টি সোডিয়াম (Na), ৩টি অক্সিজেন (O)।

সমাধানের ধাপসমূহ

  1. স্ট্যাক ব্যবহার করে ব্র্যাকেট হ্যান্ডেল করুন।
  2. প্রতিটি পরমাণু পാർസ করুন: নাম + ঐচ্ছিক সংখ্যা।
  3. ব্র্যাকেট খুললে বর্তমান ম্যাপ স্ট্যাকে পুশ করুন, নতুন ম্যাপ শুরু করুন।
  4. ব্র্যাকেট বন্ধ হলে গুণফল বের করে পাওয়ার ম্যাপে যোগ করুন।
  5. শেষে ম্যাপ থেকে স্ট্রিং বানান।

প্রোগ্রাম উদাহরণ

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

class Solution {
public:
    string makeRet(map<string, int> m) {
        string ret = "";
        for (auto& it : m) {
            ret += it.first;
            if (it.second > 1)
                ret += to_string(it.second);
        }
        return ret;
    }
    
    string countOfAtoms(string s) {
        map<string, int> m;
        stack<map<string, int>> st;
        int i = 0, n = s.size();
        
        while (i < n) {
            char c = s[i++];
            if (c == '(') {
                st.push(m);
                m = map<string, int>();
            }
            else if (c == ')') {
                int val = 0;
                while (i < n && isdigit(s[i])) {
                    val = val * 10 + (s[i++] - '0');
                }
                map<string, int> temp = st.top();
                st.pop();
                for (auto& it : m) {
                    it.second *= val;
                    temp[it.first] += it.second;
                }
                m = temp;
            }
            else {
                string name = "";
                name += c;
                while (i < n && islower(s[i]))
                    name += s[i++];
                int val = 0;
                while (i < n && isdigit(s[i]))
                    val = val * 10 + (s[i++] - '0');
                val = val == 0 ? 1 : val;
                m[name] += val;
            }
        }
        return makeRet(m);
    }
};

int main() {
    Solution ob;
    cout << (ob.countOfAtoms("Na2(CO)3"));
}

ইনপুট

Na2(CO)3

আউটপুট

C3Na2O3
  1. Frugal সংখ্যা চেক করা (C++)

  2. C++ দিয়ে পেন্টাটপ (Pentatope) সংখ্যা বের করা

  3. সি++-এ নাম্বার অফ এনক্লেভস (Number of Enclaves)

  4. C++-এ অ্যাডাম সংখ্যা (Adam Number) চেক করার পদ্ধতি