fork download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <regex>
  4. #include <string>
  5.  
  6. std::string getPeriodicFraction(const std::string& valueStr) {
  7. std::regex pattern("[0-9]+\\.([0-9]+?)\\1+");
  8. std::smatch match;
  9. std::regex_match(valueStr, match, pattern);
  10. if(match.size() == 2) {
  11. return match[1];
  12. }
  13. return {};
  14. }
  15.  
  16. void showResult(double value, const std::string& valueStr, const std::string& perStr) {
  17. if(perStr.size()) {
  18. std::cout << "Ułamek " << valueStr << "... jest okresowy.\n"
  19. << "Ma okres o długości " << perStr.size() << '\n'
  20. << "Forma z okresem: " << static_cast<int>(value)
  21. << ".(" << perStr << ")\n";
  22. } else {
  23. std::cout << "Ułamek " << valueStr << " nie jest okresowy\n";
  24. }
  25. }
  26.  
  27. void hbar() {
  28. std::cout << std::string(30, '-') << '\n';
  29. }
  30.  
  31. int main() {
  32. double val = 2.0/3.0;
  33. auto valStr = std::to_string(val);
  34. auto perStr = getPeriodicFraction(valStr);
  35.  
  36. std::cout << "W notacji zmiennoprzecinkowej:\n";
  37. hbar();
  38. showResult(val, valStr, perStr);
  39. hbar();
  40.  
  41. std::cout << "Bez ostatniej cyfry:\n";
  42. hbar();
  43. perStr = getPeriodicFraction({valStr.cbegin(), valStr.cend() - 1});
  44. showResult(val, valStr, perStr);
  45. }
Success #stdin #stdout 0s 4436KB
stdin
Standard input is empty
stdout
W notacji zmiennoprzecinkowej:
------------------------------
Ułamek 0.666667 nie jest okresowy
------------------------------
Bez ostatniej cyfry:
------------------------------
Ułamek 0.666667... jest okresowy.
Ma okres o długości 1
Forma z okresem: 0.(6)