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

Am nevoie de ajutor la punctul b). As dori si explicatii.

Anexe:

Răspunsuri la întrebare

Răspuns de JolieJulie
3

Salut :)

a)

Trebuie sa te folosesti de cunostintele la mate despre ecuatia de gradul II.Faci delta,pt delta <=0 e usor,dar pt delta>0 trebuie sa verifici si daca ecuatia are cel putin o solutie pozitiva si practic ea e cea mai mare si trebuie sa o returnezi,daca nu,returnezi tot -32000.

Subprogramul ↓

int Ecuatie (int a,int  b,int  c)

{

   float delta,rez1,rez2;

   delta =b*b-4*a*c;

   if(delta<0)

       return -32000;

   else

   {

       if(delta>0)

       rez1=(-1)*b/2/a+(float)sqrt(delta)/2/a;

       rez2=(-1)*b/2/a-(float)sqrt(delta)/2/a;

       if(rez1>0)

           return rez1;

       if(rez2>0)

           return rez2;

       else

           return -32000;

           if(delta==0)

               return (-1)*b/2/a;

   }

}

b)   Ca sa creezi fisierul de iesire,urmezi pasii astia : File → New → Empty file → Yes → sir.out (in loc de untitled1) → Save → Ok

Asta e metoda mea,poate mai sunt si altele... ↓

#include <iostream>

#include <fstream>  // pt fisiere

using namespace std ;

ofstream fout("sir.out");  //aici se va afla rezultatul

int Ecuatie (int s[],int k)

{

   int i,aux=1,p=0;

   while(p<=k)

   {

       for(i=aux; i>0; i--)

       {

           s[p]=aux-i+1;

           p++;

       }

       aux++;

   }

   return s[k-1];

}

int main()

{

   int s[100],nr,i,k;

   cout<<"k=";

   cin>>k;

   fout<<Ecuatie(s,k);

}

c) Pentru ca un program sa aiba eficienta,acesta trebuie sa execute un numar cat mai putin de pasi in timp cat mai scurt pentru a ajunge la rezultat.Programarea cu tablouri unidimensionale (vectori) constituie metoda eficienta cea mai utilizata in algoritmii de programare.Asadar,am reprezentat sirul printr-un vector.


OmuBacovian: are you sure ? Nu ai mai facut variante de BAC pana acum ? Sau sa inteleg ca tu nu dai bac la info?
JolieJulie: Noi asa rezolvam la scoala...
JolieJulie: Am pus (-1)* pt ca poate b era negativ si era aiurea sa fie --b
JolieJulie: O sa dau bacul la info anul viitor :))
OmuBacovian: mult noroc atunci ! Apropos , inca o chestie importanta : eficienta consta in memoria utilizata si timpul de executare . Din cate vad tu nu te-ai raportat deloc la "memoria utilizata"
OmuBacovian: Sau te-ai raportat asa mai subtil :)
boiustef: de ce s-a modificat functia Ecuatie la punctul b) ? trebuia de aplicat structura ei din punctul a)
OmuBacovian: @boiustef asta m-am intrebat si eu :)
boiustef: ;i cred se a;teapt[ s[ nu se foloseasc[ vector
JolieJulie: Eu am crezut ca e o altfel de functie,diferita de pct a),deci am luat-o cum am vrut eu :))
Răspuns de boiustef
1

Răspuns:

#include <iostream>

#include <fstream>

#include <cmath>

using namespace std;

ofstream f("sir.out");

float Ecuatie(int a, int b, int c)

{

   int d=b*b-4*a*c;

   if (d<0) return -32000;

   else

   {

       if (d==0)

       {

           float x=1.0*(-b)/(2*a);

           if (x>0) return x;

           else return -32000;

       }

       else

       {

           float x1=1.0*(-b-sqrt(d))/(2*a);

           float x2=1.0*(-b+sqrt(d))/(2*a);

           float x=max(x1,x2);

           if (x>0) return x;

           else return -32000;

       }

   }

}

int k, grup, sgaus, num;

int main()

{

   cin >> k;

   grup=(int)Ecuatie(1,1,-2*k);

   if (grup%2==0)

       sgaus=(grup/2)*(grup+1);

   else sgaus=(grup+1)/2*grup;

   if (sgaus==k)

   {

       num=grup;

   }

   else

   {

       if (sgaus<k)

       {

           ++grup;

           num=(k-sgaus)%grup;

       }

       else num=(sgaus-k)%grup;

   }

   f << num;

}

Explicație:

sirul cercetat poate fi împărţit în grupuri astfel:

(1) (12) (123) (1234) (12345) (123456) ....

Ne interesează numărul de pe poziţia k în acest şir. Numărul căutat se află în careva grup. Numărul de elemente în grupuri formează şirul 1,2,3,4,5,...

folosind sumagaus putem calcula 1+2+3+4 =4*(4+1)/2 aflăm cîte numere sunt în primele 4 grupuri. Adică dacă notăm prin g numărul de grupuri, atunci conform sumeigaus sgaus=g*(g+1)/2. sgaus poate fi mai mare sau mai mica decat k, sau egală cu k. Pentru a afla grupul trebuie să rezolvăm ecuaţia

g*(g+1)=2*k, de unde g^2+g-(2*k)=0. Apelăm funcţia Ecuatie cu parametrii 1,1,2*k. Rezultatul din funcţie îl convertim în int şi asta este grupul în care se află numărul căutat. dacă sgaus < k, atunci crestem grupul.

Sper că am fost explicit :))) Dacă nu prea, întreabă...


OmuBacovian: multumesc ! am inteles.
OmuBacovian: apropos , ati uitat return 0
boiustef: in c++ e inutil in main pentru cazul dat
boiustef: pentru orice evntualitate pune-l
JolieJulie: Wow...
Alte întrebări interesante