fbpx

Problema #2307 – dec2ord – Rezolvari PBInfo

de Mihai-Alexandru

Medeea este elevă în clasa a V-a. Profesorul ei de matematică, domnul X, le-a arătat la oră cum se transformă o fracție din fracție zecimală în fracție ordinară. Totuși, Medeea vorbind cu colega ei în timpul predării, când a ajuns acasă a realizat că nu știe cum să transforme fracția din temă. Medeea vă roagă să o ajutați să rezolve tema transformând fracția zecimală primită în fracție ordinară şi să o aduceți la forma ireductibilă.

Cerința

Medeea vă roagă să o ajutați să rezolve tema transformând fracția zecimală primită în fracție ordinară şi să o aduceți la forma ireductibilă.

Date de intrare

Fişierul de intrare dec2ord.in conține pe prima linie partea întreaga a numărului, pe a doua linie se află partea zecimală neperiodică, iar pe a treia partea periodică.

Date de ieșire

Fişierul de ieşire dec2ord.out conține pe o singură linie o fracție ordinară ireductibilă de forma numărător/numitor.

Restricții și precizări

  • Fiecare parte are maximum 5 cifre
  • Se garantează că fracția dată are cel puțin o zecimală
  • Dacă fracția nu are parte periodică sau zecimală neperiodică, pe linia aferentă se va afla -1.
  • Pentru 70% din teste fracțiile nu au perioadă

Exemplu

dec2ord.out

125
9
6

dec2ord.out

3779/30

Explicație

125,9(6) = 3779/30.

#include <bits/stdc++.h>
using namespace std;
ifstream cin("dec2ord.in");
ofstream cout("dec2ord.out");
int main()
{
    int n , z , per;
    cin >> n >> z >> per;
    if(z==-1 && per==-1) cout << n;
    else if(per==-1 && z!=-1)
    {
        int p = 1 , cz = z;
        while(cz)
        {
            p*=10;
            cz/=10;
        }
        int a=n*p+z;
        int b=p;
        while(b)
        {
            int r=a%b;
            a=b;
            b=r;
        }
        cout << (n*p+z)/a << '/' << p/a;
    }
    else if(z==-1 && per!=-1)
    {
        int cper=per;
        int p=1;
        while(cper)
        {
            cper/=10;
            p*=10;
        }
        int a=n*p+per-n;
        int b=p-1;
        while(b)
        {
            int r=a%b;
            a=b;
            b=r;
        }
        cout << (n*p+per-n)/a << '/' << (p-1)/a;
    }
    else if(z!=-1 && per!=-1)
    {
        long long int p = 1 , p1 = 1 , cz = z , cper = per; 
        while(cz)
        {
            p*=10;
            cz/=10;
        }
        while(cper)
        {
            p1*=10;
            cper/=10;
        }
        long long int q=n*p+z;
        long long int a=q*p1+per-q;
        long long int b=(p1-1)*p;
        while(b)
        {
            long long int r=a%b;
            a=b;
            b=r;
        }
        cout << 1LL * (q*p1+per-q)/a << '/' << 1LL * ((p1-1)*p)/a;
    }
}
Comentarii

S-ar putea sa iti placa