Informatică, întrebare adresată de Annamarriaa, 9 ani în urmă

Cum aflu radical dintr-un numar fara sa folosesc functia "sqrt"?


blindseeker90: sa mai intri o data pe pagina ca am uitat sa editez codul. Acum este editat.

Răspunsuri la întrebare

Răspuns de blindseeker90
0
Practic ceea ce vrei tu sa rezolvi este urmatoarea ecuatie
x^{2}=n\Rightarrow x=\frac{n}{x}\Rightarrow x-\frac{n}{x}=0\
unde n este numarul si x este radicalul din acel nr
O metoda simpla de a rezolva aceasta problema este sa dai o valoare la intamplare lui x, sa observi ce valoare ia acea diferenta, si apoi sa schimbi valoarea lui x din nou pentru a te apropria de valoarea 0
Modul in care faci schimbarea e usor de vazut:
daca valoarea diferentei este pozitiva,mai mare ca 0 atunci valoarea lui x trebuie scazuta(cu cat x este mai mic, cu atat n/x este mai mare, deci diferenta va deveni mai mica)
daca valoarea diferentei este negativa,<0, atunci trebuie crescuta valoarea diferentei, adica x este mai mare
O idee pentru a rezolva aceasta situatie este sa imparti spatiul de cautare in doua la fiecare iteratie.
De exemplu, sa zicem ca vrei sa afli radicalul lui 102
Stim ca radicalul unui numar este mai mic decat jumatate din valoarea lui
pentru valori mai mari ale lui n. Atunci, consideram intervalul de cautare
stanga=0, dreapta=102/2=51. Atunci punctul de cautare in interval il luam la jumatate x0=(51-0)/2=25.5
Facem diferenta (25.5-101/25.5)=21.53. Deci daca diferenta este pozitiva, trebuie sa trebuie sa scadem valoarea lui x0. Intervalul de cautare devine:
stanga=0 dreapta=25.5, atunci x0=(25.5-0)/2=12.75
Iar diferenta este: (12.75-101/12.75)=4.75. Iarasi este o valoare pozitiva, iarasi trebuie sa scadem stanga=0, dreapta=12.75, x0=(12.75-0)/2=6.375
diferenta va da: (6.375-101/6.275)=-9.625 acum este o valoare negativa, deci trebui sa crestem numarul: stanga=6.375 dreapta=12.75, x0=(12.75-6.375)/2=9.5625 si asa mai departe.

Acum te intrebi: cand se termina? Poate iti trebuie mii de iteratii pana devine valoarea 0. Atunci, poti sa pui doua conditii:
1) numar total de iteratii
2) ce precizie ne dorim la diferenta(daca diferenta este 0.001 poate ne multumeste, daca este de 0.01, poate nu este suficient)
Ai codul mai jos:
#include <iostream>
#include <cmath>
using namespace std;

int main(){
double n,x0,stanga,dreapta,eroare,max_iteratii,nr_iter=0;
cout<<"Introduceti numarul:";
cin>>n;
cout<<"Introduceti eroarea maxima:";
cin>>eroare;
cout<<"Introduceti numarul maxim de iteratii:";
cin>>max_iteratii;
stanga=0;
dreapta=n/2;
x0=stanga+(dreapta-stanga)/2;
cout<<"Aproximari si erori\n";

while(abs(x0-n/x0)>eroare&&(nr_iter<max_iteratii)){
if((x0-n/x0)>0){
dreapta=x0;
}
else{
stanga=x0;
}

x0=stanga+(dreapta-stanga)/2;
nr_iter++;
cout<<"Nr "<<nr_iter<<": "<<x0<<" "<<x0-n/x0<<endl;

}
cout<<"Rezultat final: "<<x0;

return 0;
}

Annamarriaa: Ai putea sa o faci mai pe intelesul unui elev de clasa a 9a?:)) Adica nu inteleg tot ce ai facut
Annamarriaa: Ce este eroarea maxima?
Alte întrebări interesante