#include <iostream>
#include <iomanip>
#include <regex>
#include <string>
 
std::string getPeriodicFraction(const std::string& valueStr) {
    std::regex pattern("[0-9]+\\.([0-9]+?)\\1+");
    std::smatch match;
    std::regex_match(valueStr, match, pattern);
    if(match.size() == 2) {
        return match[1];
    }
    return {};
}
 
void showResult(double value, const std::string& valueStr, const std::string& perStr) {
    if(perStr.size()) {
        std::cout << "Ułamek " << valueStr << "... jest okresowy.\n"
            << "Ma okres o długości " << perStr.size() << '\n'
            << "Forma z okresem: " << static_cast<int>(value)
            << ".(" << perStr << ")\n";
    } else {
        std::cout << "Ułamek " << valueStr << " nie jest okresowy\n";
    }
}
 
void hbar() {
    std::cout << std::string(30, '-') << '\n';
}
 
int main() {
    double val = 2.0/3.0;
    auto valStr = std::to_string(val);
    auto perStr = getPeriodicFraction(valStr);
 
    std::cout << "W notacji zmiennoprzecinkowej:\n";
    hbar();
    showResult(val, valStr, perStr);
    hbar();
 
    std::cout << "Bez ostatniej cyfry:\n";
    hbar();
    perStr = getPeriodicFraction({valStr.cbegin(), valStr.cend() - 1});
    showResult(val, valStr, perStr);
}