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

Am rezolvat aceasta problema pe pbinfo si am luat 100 de puncte dar cred ca se putea si mai usor.Imi puteti arata?
--SURSA DE LA PROBLEMA MEA E MAI JOS---


Cerinţa
Să se scrie un program care citește un șir de n numere naturale şi determină cea mai mică fracţie care poate fi scrisă cu numărătorul şi numitorul dintre cele n numere.

Date de intrare
Programul citește de la tastatură numărul n, iar apoi n numere naturale nenule, separate prin spaţii.

Date de ieşire
Programul afișează pe ecran numărul fracţia cerută, în forma x/y.

Restricţii şi precizări
0 < n < 1001
cele n numere citite vor fi mai mici decât 2.000.000.000
fracţia afişată va fi ireductibilă



Exemplu
Intrare

5
6 10 3 2 5
Ieșire

1/5


SURSA MEA:(Daca se poate sa imi explicatii cu comentarii va rog :)      )
-------------------------------------------------------------------------------------------

#include

using namespace std;

int GCD(int a, int b)
{
int rest;
while(b)
{
rest = a % b;
a = b;
b = rest;
}
return a;

}

int main()
{
int n, numarator, numitor,numar1,numar2,numar,maxim,minim, maxim_prime, minim_prime;
cin >> n;
cin >> numar1;

cin >> numar2;
maxim_prime = max(numar1, numar2);  /// maxim si minim prime sunt numerele care nu se schimba decat daca se gasteste ceva mai mare decat respectivii fata de maxim si minim  care se schimba la fiecare executie ///
minim_prime = min(numar1, numar2);


for(int i = 3; i <= n ; i++)
{

int last_number = numar2;
cin >> numar;

maxim = max(last_number, numar);
minim = min(last_number, numar);


if(maxim > maxim_prime)
maxim_prime = maxim;
if(minim < minim_prime)
minim_prime = minim;
}
numarator = minim_prime / GCD(minim_prime, maxim_prime);
numitor = maxim_prime / GCD(minim_prime, maxim_prime);
cout << numarator << "/" << numitor ;


}

Răspunsuri la întrebare

Răspuns de ated
4
Eu unul nu vad nicio solutie care ar putea fi mai buna, ca pana la urma cea mai mica fractie e formata din cel mai mic numar drept numarator si cel mai mare numar drept numitor.
Ai putea totusi sa nu folosesti nume prea lungi pentru variabile ca sa nu scrii prea mult. Variabile precum x sau y sunt bune pentru ca asta nu e un program real, de N mii de linii de cod, ci e doar o problema la info. Si nu era neaparat nevoie sa faci o functie pentru CMMDC :).
Uite cum as restructura eu codul:

#include <iostream>

using namespace std;

int main()
{
    int n, x, min, max;
    cin >> n >> x;
    min = max = x;
    for(int i=1; i<n; i++)
    {
        cin >> x;
        if (x < min)
            min = x;
        if (x > max)
            max = x;
    }
    int a = min, b = max;
    while(b)
    {
        int c = a%b;
        a = b;
        b = c;
    }
    cout << min/a << "/" << max/a;
    return 0;
}

imthebestprogrammer: Da m-am complicat aiurea cu intializarea a 2 numere la inceput cand puteam sa initializez max si min cu primul numar si dupa sa citest urmatorul numar din sir.In rest vad ca e la fel.Ms pt raspuns !!!
ated: Cu placere :).
Alte întrebări interesante