• 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

VPS Starter Arubacloud
0 głosów
1,809 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 783 wizyt
pytanie zadane 22 listopada 2016 w C i C++ przez Kenzi Nowicjusz (200 p.)
0 głosów
1 odpowiedź 550 wizyt
pytanie zadane 3 czerwca 2019 w C i C++ przez zaliczenie14 Użytkownik (620 p.)
0 głosów
1 odpowiedź 170 wizyt
pytanie zadane 17 kwietnia 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)

92,453 zapytań

141,262 odpowiedzi

319,087 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...