Informatică, întrebare adresată de threshlol24p5n5n7, 8 ani în urmă

/***1. Se dau n perechi de numere naturale nenule, fiecare reprezentând câte o fracţie.
Calculaţi suma celor n fracţii, aducând rezultatul la forma ireductibilă.
Programul citeste din fisierul fractii.in de pe prima linie un număr natural n ( n<=100),
iar de pe următoarele n linii perechi de numere separate printr-un spațiu,
reprezentând numărătorul şi numitorul unei fracţii. Programul afișează pe ecran numerele P si Q,
separate prin exact un spaţiu, reprezentând numărătorul şi numitorul fracţiei sumă, adusă la forma ireductibilă.
( numerele sunt cu cel mult 9 cifre)
Ex.
4
1 3
5 6
1 2
4 2
Se va afisa 11
*/

#include
#include

using namespace std;
ifstream fin("fractii.in");

int n,numitor,numarator,a,b,d,im,r,P,Q;
int main()
{
fin>>n;
fin>>a>>b;
numarator=a;
numitor=b;
for(int i=2;i<=n;i++)
{
fin>>a>>b;
numarator=a*numitor+numarator*b;
numitor=b*numitor;
d=numarator;
im=numitor;
r=d%im;
}
while(r)
{
d=im;
im=r;
r=d%im;
}
numarator=numarator/im;
numitor=numitor/im;

P=numarator;
Q=numitor;
cout< return 0;
}



Salut ar putea cineva sa adauge niste comentarii la problema respectiva pentru a intelege ce face algoritmul?
In special la acel for?
Multumesc!!


lucaciucandrei: voi reface algoritmul, cu tot cu comentarii

Răspunsuri la întrebare

Răspuns de lucaciucandrei
1

ASTA E CEA MAI RAPIDA SOLUTIE!

#include<iostream>

#include<fstream>

using namespace std;

int main(){

   int n, a1, b1, ai, bi; //n este numarul de fractii (perechi de numere ai-numarator, bi-numitor), a1 si b1 sunt numaratorul, respectiv numitorul primei fractii, iar ai si bi sunt numaratorul, respectiv numitorul fractiei i

   ifstream f("fractii.in"); //se deschide fisierul "fractii.in" pentru a se citi date din el

   f>>n>>a1>>b1; //citeste numarul de fractii, numaratorul si numitorul primei fractii

   for(int i=2;i<=n;i++){ //aici se citesc cele n fractii, i fiind indicele perechii de numere (ai, bi); i incepe de la 2 deoarece ai=1 si bi=1 au fost citite

       f>>ai>>bi; //aici citeste efectiv perechile de numere

       //urmatorii doi pasi aduna restul fractiilor citite la prima fractie

       a1=a1*bi+ai*b1; //se amplifica numaratorul primei fractii cu numitorul fractiei i si se aduca cu numaratorul fractiei i amplificat cu numitorul fractiei 1

       b1=b1*bi; //se aduce fractia 1 la acelasi numitor cu fractia i

       //pasii anteriori se repeta pana cand au fost citite cele n fractii, adica se vor aduna toate fractiile la prima si se va aduce la acelasi numitor de fiecare data

   }

   f.close(); //se inchise fisierul din care se citeste

   int ca1=a1, cb1=b1; //fac o copie a rezultatului final al adunarii fractiilor; ca1=copia numaratorului final, cb1=copia numitorului final

   //urmatorul while afla cel mai mare divizor comun pentru a aduce fractia la o forma ireductibila; se numeste algoritmul lui Euclid prin impartiri repetate

   while(cb1!=0){

       int r=ca1%cb1;

       ca1=cb1;

       cb1=r;

   }

   cout<<(float)(a1/ca1)/(b1/ca1); //se afiseaza fractia la forma ireductibila prin impartirea numaratorului si a numitorului la cmmdc-ul lor

}

Alte întrebări interesante