Program wyznaczajacy ułamek dziesietny nie dziala

0

Witam mam problem, nie działa mi program, który ma za zadanie zamienić dane wejściowe licznik i mianownik na ułamek dzisiętny uwzględniając ułamki okresowe. Czyli np dla danych wejściowych 1 i 2, powinien zwrócić 0.5000 (cyfry po przecinku zeleżne od tego ile sobie ustawie globalnie w tablicy). Wszystko dobrze hula ale dla danych wejściowych np 1 i 6 program wypisuje jakiś głupoty zamiast 0.1(6)

#include <iostream>
using namespace std;

const int MAX = 100;

int szukaj(int tab[MAX], int a, int wartosc){
    for(int i = 0; i < a; i++)
        if(tab[i] == wartosc){
            return i;
        }
    return -1;
}

void wartosc_ulamka(int licznik, int mianownik){
    cout << licznik / mianownik << ".";
    int tab[MAX];
    int reszty[MAX];
    bool okres = false;
    for(int i = 0; i < MAX; i++){
        reszty[i] = -1;
        tab[i] = 0;
    }
    licznik = licznik % mianownik;
    for(int i = 0; i < MAX; i++){
        licznik *= 10;
        tab[i] = licznik / mianownik;
        int liczba = szukaj(reszty, i, licznik % mianownik);
        if(liczba != -1){
            for(int j = 0; j < liczba; j++)
                cout << tab[j];
            cout << "(";
            for(int j = liczba; j < i; j++)
                cout << tab[j];
            cout << ")";
            okres = true;
            break;
        }
        reszty[i] = licznik = licznik % mianownik;
        if(reszty[i] == 0) break;
    }
    if(!okres)
        for(int i = 0 ; i < MAX; i++)
            cout << tab[i];
}

int main(){
    int licznik, mianownik;
    int tab[MAX];
    cin >> licznik >> mianownik;
    wartosc_ulamka(licznik, mianownik);
}
1

a debuggowales kod?

0

Tak, ale nie wiem co poprawić, bo próbuję coś ale potem inne przykłady nie działają

2

A spróbuj zastosować taką technikę: napisz tutaj linijka po linijce, co powyższy program powinien według Ciebie robić. Ale dokładnie, linijka po linijce, wyrażenie po wyrażeniu. Chodzi mi o analizę powyższego programu, a nie algorytmu.

1

Dopiero jak wykryjesz okres to możesz stwierdzić, gdzie wstawić nawias otwierający. Wcześniej nie jesteś w stanie tego ustalić.
Wniosek, za wcześnie próbujesz wypisać wynik.
Wypisuj go dopiero po zakończeniu obliczeń.
Używaj STL (std::vector i std::vector::find).

Coś mi się kojarzy, że to jest zadanie ze SPOJ lub starej olimpiady.


przykład danych wejściowych: `10 192` -> `0.05208(3)` `1 170` -> `0.0(0588235294117647)`
0

ludzkość ma dostatecznie dużo problemów do rozwiązania, nie wynajdujmy koła na nowo

#include <iostream>

using namespace std;

int main() {
    int l, m;
    cin >> l >> m;
    cout << (double)l /  (double)m << endl;
    return 0;
}
1
maciox123 napisał(a):

Tak, ale nie wiem co poprawić, bo próbuję coś ale potem inne przykłady nie działają

To zrób te funkcje bardziej testowalne.
Np. niech wartosc_ulamka() zwraca string. I dopisz funkcję test() która wywoła tę poprzednią i sprawdzi jej wynik.
A potem piszesz w main:

test(2,3,"0.(6)");
test(1,3,"0.(3)");
...

1 użytkowników online, w tym zalogowanych: 0, gości: 1