• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja w c++ zaznaczająca ułamek dziesiętny okresowy

Object Storage Arubacloud
0 głosów
1,852 wizyt
pytanie zadane 20 marca 2018 w C i C++ przez MercinQ Początkujący (370 p.)
Witam,

Czy jest funkcją która sprawdza czy ułamek dziesiętny jest okresowy ?

Mam prosty problem podaję na wejściu 2/3 i na wyjściu ma pojawić się wtedy 0.(6).

2 odpowiedzi

0 głosów
odpowiedź 20 marca 2018 przez mokrowski Mędrzec (155,460 p.)
wybrane 20 marca 2018 przez MercinQ
 
Najlepsza

Z braku lepszych odpowiedzi...

#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);
}

Niestety ale liczby zmiennoprzecinkowe mają dość ciekawe właściwości utrudniające to zadanie :-) Oczywiście jeśli chcesz wykrywać dłuższe okresy, trzeba kod nieco zmodyfikować ze względu na straty konwersji... ale to już we własnym zakresie. IMHO i tak ta droga nie jest najbardziej "elegancka".

komentarz 20 marca 2018 przez Beginer Pasjonat (22,110 p.)
Moja wersja MinGW jest z 2016r., a więc nie jest stara. Jak wiele razy widziałeś, na forum chodzą jeszcze programy w C.

Pokaż mi linię, gdzie wprowadzasz dane wejściowe (ułamek), bo ja nie widzę.
komentarz 20 marca 2018 przez mokrowski Mędrzec (155,460 p.)

Czytaj ze zrozumieniem: Masz wersję kompilatora z błędem niepełnej obsługi standardu C++11. To z którego jest roku jest tematem pobocznym. Po to podałem Ci link byś go przeczytał i nie tracił mojego czasu.

 

komentarz 20 marca 2018 przez Beginer Pasjonat (22,110 p.)
Ja nie mam czasu na zabawę. Karty na stół !  Pokaż swoje wyniki.
komentarz 20 marca 2018 przez mokrowski Mędrzec (155,460 p.)
1. Już drugi raz powtarzasz ten sam scenariusz "u mnie nie działa a świat jest winien".

2. Po raz drugi zmuszasz mnie bym tłumaczył się "że nie jestem wielbłądem"

3. Masz w głębokim poważaniu zalecenia i czas który Ci ktoś poświęca.

Ergo... 3 razu z mojej strony dla Ciebie nie będzie.

https://ideone.com/7dAdi7

https://wandbox.org/permlink/xqeoCRnsKToRFZtS

http://cpp.sh/7lyrq
komentarz 21 marca 2018 przez Beginer Pasjonat (22,110 p.)
1. Kompilowałeś w standarcie C++14, a nie jak twierdziłeś w C++11.

2. Fajnie, że pokazujesz nowoczesne rozwiązania, ale wówczas trzeba zamieszczać jakiś krótki, opis komentarz. (Żeby to miało sens dydaktyczny).. .

3. Ułamek może być nieskończony ale wcale nie musi być okresowy.
0 głosów
odpowiedź 20 marca 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Nie znam takiej funkcji, ale zawsze możesz spróbować ją napisać samodzielnie.

Podpowiem Ci nieco: dysponując ułamkiem, którego nie można już bardziej skrócić (np. 3/5), możesz łatwo sprawdzić, czy będzie miał on rozwinięcie dziesiętne skończone, czy nieskończone. Jeżeli mianownik w rozkładzie na czynniki pierwsze da tylko dwójki lub piątki, to ułamek ma skończone rozwinięcie.

Przykład: 1/50. Mianownik to 50 = 2 * 5 * 5, a więc są tam tylko dwójki i piątki i rozwinięcie dziesiętne będzie skończone. To prawda, ponieważ 1/50 = 0.02

Inny przykład: 7/60. Mianownik to 60 = 2 * 2 * 3 * 5, a więc pojawia się tutaj liczba inna, niż dwa i pięć, więc ułamek będzie miał rozwinięcie dziesiętne nieskończone. I to również prawda, ponieważ 7/60 = 0.11(6).

Ale jak wyznaczyć te okresy, to szczerze mówiąc nie wiem, musiałbym pomyśleć. smiley

komentarz 20 marca 2018 przez Beginer Pasjonat (22,110 p.)
Właściwie już rozwiązałeś to zadanie, przez sprawdzanie mianownika ułamka.

Nie wiemy, czy chodziło również o wypisanie okresu. Wtedy trzeba by "przeskanować" wszystkie cyfry obliczonego ułamka w poszukiwaniu powtarzających się cyfr (lub sekwencji).

Podobne pytania

0 głosów
2 odpowiedzi 796 wizyt
pytanie zadane 22 listopada 2016 w C i C++ przez Kenzi Nowicjusz (200 p.)
0 głosów
1 odpowiedź 564 wizyt
pytanie zadane 3 czerwca 2019 w C i C++ przez zaliczenie14 Użytkownik (620 p.)
0 głosów
1 odpowiedź 173 wizyt
pytanie zadane 17 kwietnia 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...