👤

Se dau a și b numere naturale nenule, cu a < b. Să se determine soluțiile ecuației 1/x+1/y+1/z=a/b, unde x,y,z sunt numere naturale nenule.
Date de intrare
Programul citește de la tastatură numerele naturale nenule a și b, separate prin spațiu.

Date de ieșire
Programul va afișa pe ecran, pe linii separate, soluțiile ecuației în ordinea crescătoare a valorilor lui x, iar la valori egale ale lui x în ordinea crescătoare a valorilor lui y . În cazul în care problema nu are soluţii se va afişa mesajul NU ARE SOLUTII.

Restricții și precizări
1 ≤ a < b ≤ 100
Se vor afișa numai soluțiile cu x ≤ y ≤ z numere naturale



Exemplu
Intrare

2 3
Ieșire

2 7 42
2 8 24
2 9 18
2 10 15
2 12 12
3 4 12
3 6 6
4 4 6


Răspuns :

Sa simplificam ecuatia respectiva.Sa presupunem ca stim valoarea lui xAtunci ecuatia in cele doua variabile y si z va fi[tex]\frac{1}{y}+\frac{1}{z}=\frac{z}{yz}+\frac{y}{yz}=\frac{y+z}{yz}=\frac{a}{b}-\frac{1}{x}=\frac{ax-b}{bx}[/tex] Mai intai impartim denumitorul si numitorul din partea dreapta a egalitatii ca sa simplificam problema. Sa presupunem ca obtinem fractia in dreapta e/fAcum, sa notam cel mai mare divizor comun dintre y si z cu dcmmdc(y,z)=d. Atunci y=m*d si z=n*d, unde m si n sunt alti divizori despre care stim ca sunt primi intre ei, altfel ar fi inclusi in dcmmdc(m,n)=1Atunci fractia din dreapta devine[tex]\frac{y+z}{yz}=\frac{m*d+n*d}{m*d*n*d}=\frac{d(m+n)}{d*d*m*n}=\frac{m+n}{d*m*n}=\frac{e}{f}[/tex] unde e si f sunt prime intre eleAtunci il putem determina pe d
[tex]d=\frac{f(m+n)}{e*m*n}[/tex]
Pentru ca variabila e nu este divizor al lui f, si m*n nu este divizor al lui m+n, inseamna ca m si n sunt divizori ai lui f.
Luam la rand toti divizorii lui f si il determinam in fiecare caz pe d
Daca d este un numar intreg, atunci inseamna ca si y=d*m si z=d*n sunt numere intregi si gasim tripleta
Pentru x, incepem cu x=2, si apoi il tot crestem pana la 100.
Acesta e codul in C

#include <iostream>
#include <cmath>
using namespace std;


int verifica(int x,int y,int z){
return(x<=y&&y<=z);
}

int cmmdc(int a,int b){
int temp;
while(b>0){
temp=b;
b=a%b;
a=temp;
}
return a;
}
int main(){
int a,b,x,m,n,denumitor,numitor,numitor_divizor_comun,sol=0;
float d;
cout<<"Introduceti cele doua numere:";
cin>>a>>b;
x=2;
while(x<100){
denumitor=a*x-b;
numitor=b*x;
numitor_divizor_comun=cmmdc(denumitor,numitor);
denumitor=denumitor/numitor_divizor_comun;
numitor=numitor/numitor_divizor_comun;
for(m=1;m<=numitor;m++){
for(n=numitor;n>=1;n--){
if(numitor%n==0&&numitor%m==0&&m*n<=numitor){
d=(float)((m+n)*numitor)/(m*n*denumitor);
if(d-(int)d==0&&verifica(x,d*m,d*n)==1){
sol=1;
cout<<x<<" "<<d*m<<" "<<" "<<d*n<<endl;
}
}
}
}

x++;
}
if(sol==0){
cout<<"NU SUNT SOLUTII";
}
return 0;
}