👤

Buna!
Imi poate explica cineva aceasta problema?
Atasez algoritmul si cerinta. Nu inteleg de ce trebuie sa calculez while (x-floor(x))
si sa calculez b si mai apoi cmmdc pentru a si b.

Fişierul text NUMAR.TXT conţine pe prima linie un număr real pozitiv x care are cel mult
două cifre la partea întreagă şi cel mult şapte cifre după punctul zecimal..
a) Scrieţi un program C/C++ care, utilizând un algoritm eficient din punct de vedere al
timpului de executare şi al memoriei utilizate, afişează pe ecran, separate printr-un spaţiu,
două numere naturale al căror raport este egal cu x şi a căror diferenţă absolută este
minimă.
Exemplu: dacă fişierul conţine valoarea alăturată, se vor afişa pe ecran
numerele 3 8.

#include
#include
#include
using namespace std;
ifstream in("numar.txt");
int cmmdc (int a, int b)
{
while (a!=b)
{
if (a>b)
a=a-b;
else
b=b-a;
}
return a;
}
int main()
{
double x;
long a,b,c;
in>>x;
b=1;
///vom cauta cmmdc al lui x
while (x-floor(x))
{
x *=10;
b *=10;
}
a=x;
c=cmmdc(a,b);
a=a/c;
b=b/c;
cout< return 0;
}

Multumesc!


Răspuns :

In primul rand, conditia de la while este:

x-floor(x) != 0, scrisa matematic [tex]x - [x] \neq 0[/tex] sau [tex] \{x\} \neq 0 [/tex]

In while ai x *= 10, deci se va executa o data pentru fiecare cifra dupa virgula, si in b tii minte la ce numar trebuie sa imparti x(la final) ca sa obtii x-ul initial.

[tex]a = x_f \implies x_i = \frac{a}{b}, a,b \in \mathbb{N}, b \neq 0[/tex]

Acum ti se cere sa afli o pereche de numere (a, b), cu [tex]\frac{a}{b} = x[/tex] si [tex]|a-b|[/tex]  minim.

Cum

[tex]\frac{ya}{yb} = \frac{a}{b} = x, (\forall)y \in \mathbb{Q}^*_+[/tex], rezulta ca trebuie sa cautam un y pentru care diferenta [tex]|ya - yb|[/tex] este minima, dar in acelasi timp [tex]ya, yb \in \mathbb{N}[/tex], si atunci perechea (ya, yb) este solutia cautata.

[tex]\displaystyle |ya - yb| \in \mathbb{N} \iff y|a-b|\in \mathbb{N}\\ \\ |a - b| \in \mathbb{N} \implies y = \frac{k}{cmmdc(a, b)}, k \in \mathbb{N}^*\\ \\ |ya-yb| \: minim\\ \\ \iff y|a-b|\: minim\\ \\ \iff \textrm{y minim} \iff k = 1 \implies y = \frac{1}{cmmdc(a, b)} \implies ya = \frac{a}{cmmdc(a,b)}, yb = \frac{b}{cmmdc(a,b)}[/tex]

Deci (a/cmmdc(a,b), b/cmmdc(a,b)) este solutia cautata