#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) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHJlZ2V4PgojaW5jbHVkZSA8c3RyaW5nPgogCnN0ZDo6c3RyaW5nIGdldFBlcmlvZGljRnJhY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlU3RyKSB7CiAgICBzdGQ6OnJlZ2V4IHBhdHRlcm4oIlswLTldK1xcLihbMC05XSs/KVxcMSsiKTsKICAgIHN0ZDo6c21hdGNoIG1hdGNoOwogICAgc3RkOjpyZWdleF9tYXRjaCh2YWx1ZVN0ciwgbWF0Y2gsIHBhdHRlcm4pOwogICAgaWYobWF0Y2guc2l6ZSgpID09IDIpIHsKICAgICAgICByZXR1cm4gbWF0Y2hbMV07CiAgICB9CiAgICByZXR1cm4ge307Cn0KIAp2b2lkIHNob3dSZXN1bHQoZG91YmxlIHZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWVTdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwZXJTdHIpIHsKICAgIGlmKHBlclN0ci5zaXplKCkpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIlXFgmFtZWsgIiA8PCB2YWx1ZVN0ciA8PCAiLi4uIGplc3Qgb2tyZXNvd3kuXG4iCiAgICAgICAgICAgIDw8ICJNYSBva3JlcyBvIGTFgnVnb8WbY2kgIiA8PCBwZXJTdHIuc2l6ZSgpIDw8ICdcbicKICAgICAgICAgICAgPDwgIkZvcm1hIHogb2tyZXNlbTogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KHZhbHVlKQogICAgICAgICAgICA8PCAiLigiIDw8IHBlclN0ciA8PCAiKVxuIjsKICAgIH0gZWxzZSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJVxYJhbWVrICIgPDwgdmFsdWVTdHIgPDwgIiBuaWUgamVzdCBva3Jlc293eVxuIjsKICAgIH0KfQogCnZvaWQgaGJhcigpIHsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnN0cmluZygzMCwgJy0nKSA8PCAnXG4nOwp9CiAKaW50IG1haW4oKSB7CiAgICBkb3VibGUgdmFsID0gMi4wLzMuMDsKICAgIGF1dG8gdmFsU3RyID0gc3RkOjp0b19zdHJpbmcodmFsKTsKICAgIGF1dG8gcGVyU3RyID0gZ2V0UGVyaW9kaWNGcmFjdGlvbih2YWxTdHIpOwogCiAgICBzdGQ6OmNvdXQgPDwgIlcgbm90YWNqaSB6bWllbm5vcHJ6ZWNpbmtvd2VqOlxuIjsKICAgIGhiYXIoKTsKICAgIHNob3dSZXN1bHQodmFsLCB2YWxTdHIsIHBlclN0cik7CiAgICBoYmFyKCk7CiAKICAgIHN0ZDo6Y291dCA8PCAiQmV6IG9zdGF0bmllaiBjeWZyeTpcbiI7CiAgICBoYmFyKCk7CiAgICBwZXJTdHIgPSBnZXRQZXJpb2RpY0ZyYWN0aW9uKHt2YWxTdHIuY2JlZ2luKCksIHZhbFN0ci5jZW5kKCkgLSAxfSk7CiAgICBzaG93UmVzdWx0KHZhbCwgdmFsU3RyLCBwZXJTdHIpOwp9