#include <iostream>
#include <map>
#include <string>
#include <cctype> // Untuk fungsi isupper, islower, isdigit
std::map<std::string, int> hitungAtomSederhana(const std::string& rumus) {
std::map<std::string, int> hitungan;
int n = rumus.length();
for (int i = 0; i < n; ++i) {
// 1. Identifikasi Unsur
if (isupper(rumus[i])) {
std::string unsur = "";
unsur += rumus[i];
// Cek jika ada huruf kecil setelah huruf kapital (misal: He, Mg)
if (i + 1 < n && islower(rumus[i+1])) {
unsur += rumus[i+1];
i++; // Maju satu karakter lagi
}
// 2. Identifikasi Angka
std::string strAngka = "";
int j = i + 1;
while (j < n && isdigit(rumus[j])) {
strAngka += rumus[j];
j++;
}
int jumlah = (strAngka == "") ? 1 : std::stoi(strAngka);
hitungan[unsur] += jumlah;
i = j - 1; // Sesuaikan indeks loop utama
}
}
return hitungan;
}
int main() {
std::string rumus1 = "H2O";
std::string rumus2 = "C6H12O6";
std::cout << "Rumus: " << rumus2 << std::endl;
std::map<std::string, int> hasil = hitungAtomSederhana(rumus2);
for (const auto& pair : hasil) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y2N0eXBlPiAvLyBVbnR1ayBmdW5nc2kgaXN1cHBlciwgaXNsb3dlciwgaXNkaWdpdAoKc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gaGl0dW5nQXRvbVNlZGVyaGFuYShjb25zdCBzdGQ6OnN0cmluZyYgcnVtdXMpIHsKICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGhpdHVuZ2FuOwogICAgaW50IG4gPSBydW11cy5sZW5ndGgoKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIC8vIDEuIElkZW50aWZpa2FzaSBVbnN1cgogICAgICAgIGlmIChpc3VwcGVyKHJ1bXVzW2ldKSkgewogICAgICAgICAgICBzdGQ6OnN0cmluZyB1bnN1ciA9ICIiOwogICAgICAgICAgICB1bnN1ciArPSBydW11c1tpXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIENlayBqaWthIGFkYSBodXJ1ZiBrZWNpbCBzZXRlbGFoIGh1cnVmIGthcGl0YWwgKG1pc2FsOiBIZSwgTWcpCiAgICAgICAgICAgIGlmIChpICsgMSA8IG4gJiYgaXNsb3dlcihydW11c1tpKzFdKSkgewogICAgICAgICAgICAgICAgdW5zdXIgKz0gcnVtdXNbaSsxXTsKICAgICAgICAgICAgICAgIGkrKzsgLy8gTWFqdSBzYXR1IGthcmFrdGVyIGxhZ2kKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gMi4gSWRlbnRpZmlrYXNpIEFuZ2thCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0ckFuZ2thID0gIiI7CiAgICAgICAgICAgIGludCBqID0gaSArIDE7CiAgICAgICAgICAgIHdoaWxlIChqIDwgbiAmJiBpc2RpZ2l0KHJ1bXVzW2pdKSkgewogICAgICAgICAgICAgICAgc3RyQW5na2EgKz0gcnVtdXNbal07CiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGludCBqdW1sYWggPSAoc3RyQW5na2EgPT0gIiIpID8gMSA6IHN0ZDo6c3RvaShzdHJBbmdrYSk7CiAgICAgICAgICAgIGhpdHVuZ2FuW3Vuc3VyXSArPSBqdW1sYWg7CiAgICAgICAgICAgIAogICAgICAgICAgICBpID0gaiAtIDE7IC8vIFNlc3VhaWthbiBpbmRla3MgbG9vcCB1dGFtYQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBoaXR1bmdhbjsKfQoKaW50IG1haW4oKSB7CiAgICBzdGQ6OnN0cmluZyBydW11czEgPSAiSDJPIjsKICAgIHN0ZDo6c3RyaW5nIHJ1bXVzMiA9ICJDNkgxMk82IjsKICAgIAogICAgc3RkOjpjb3V0IDw8ICJSdW11czogIiA8PCBydW11czIgPDwgc3RkOjplbmRsOwogICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gaGFzaWwgPSBoaXR1bmdBdG9tU2VkZXJoYW5hKHJ1bXVzMik7CgogICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogaGFzaWwpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgcGFpci5maXJzdCA8PCAiOiAiIDw8IHBhaXIuc2Vjb25kIDw8IHN0ZDo6ZW5kbDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=