/***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!!
Răspunsuri la întrebare
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
}