Am nevoie de ajutor la punctul b). As dori si explicatii.
Răspunsuri la întrebare
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.
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ă...