Jump to content
rocket92

am o problema cu un program in c++

Recommended Posts

Posted

Puteti sa imi rezolvati si mie acest program?va multumesc!

Am nevoie de programul de la exercitiul (4),dar are un punct care se refera la un exercitiu anterior (3).

3. Scrie?i defini?ia complet? a subprogramului Ecuatie care prime?te prin parametrii a, b ?i c

trei numere întregi, a ? 0, de cel mult patru cifre fiecare, reprezentând coeficien?ii ecua?iei de

gradul al II-lea: ax 2 +bx+c=0. În func?ie de solu?iile ecua?iei subprogramul va returna:

• cea mai mare dintre solu?ii dac? ecua?ia are dou? solu?ii reale distincte, dintre care cel

pu?in una pozitiv?.

• una dintre solu?ii dac? ecua?ia are dou? solu?ii egale ?i pozitive.

• -32000 în celelalte cazuri. (10p.)

4. Se consider? ?irul s: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 1, 2,... .

Pentru un num?r natural k, 0<k?10000, se cere s? se determine valoarea elementului ce

se afl? pe pozi?ia k în ?irul s.

Exemplu: pentru k=5 num?rul cerut este 2.

a) Scrie?i un program C/C++ care cite?te de la tastatur? valoarea num?rului natural k ?i, prin

apeluri utile ale func?iei Ecuatie, definite la punctul 3, determin? valoarea elementului ce

se afl? pe pozi?ia k în ?irul s, folosind un algoritm eficient din punctul de vedere al spa?iului

de memorie alocat ?i al timpului de executare. Valoarea astfel determinat? se va scrie în

fi?ierul text sir.out. (6p.)

B) Descrie?i succint, în limbaj natural, metoda de rezolvare folosit?, explicând în ce const?

eficien?a ei (3 – 4 rânduri) (4p.)

Posted

Tot mai multi useri noi la care le trebuie probleme pentru competente sau bac... deja devine aiurea. Mai faceti si singuri...

Tu nu ai o problema intr-un program... tu vrei sa iti facem programul...

Posted

@Starker de ce nu rezolvi mai intai sau dai macar un pont si apoi sa te legi cu adevarat de om ... nu e o intrebare chiar atat de banala.

http://ideone.com/h2Gxg


/*
* Problema nu e chiar atat de simpla pe cat pare, totusi se poate obtine
* matematic o complexitate amortizata O(140).
* La prima vedere se observa ca sirul contine secvente de numere unde
* secventa[i] contine aceleasi numere ca si secventa[i-1] + X unde
* X reprezinta dimensiunea+1 a secventei i-1, practic la fiecare secventa
* se adauga in plus fata de penultima un numar mai mare cu 1 fata de ultimul adaugat.
*
* Lungimea unui sir format din subsecvente complete este suma lungimilor fiecarei
* subsecvente: 1 + 2 + 3 + ... + N respectiv N(N+1)/2.
* Sa zicem ca avem K=3 (lungimea sirului) si vrem sa aflam N (lungimea ultimei subsecvente).
* Atunci N(N+1)/2=K devine N^2/2+N/2=K mai exact avem ecuatia 0.5N^2+0.5N-K=0.
* Rezolvam ecuatia cu ajutorul subprogramului si vedem ca N=2 pentru K=3
* deci lungimea ultimei subsecvente este 2 adica avem sirul: (1)(12) iar N e ultimul termen.
* Stiind N stim si ultimul termen din subsecventa (care este egal cu N) astfel
* aflam si ce termen avem pe pozitia K (pozitie pentru care N este radacina intreaga)
* dar nu pentru orice K vom avea solutii intregi, asa ca tot aflam radacina pozitiva
* pana cand ea apartine lui [N]*, decrementand pe K. In momentul asta stim ca elementul
* de pe noul K este chiar radacina, dar de la vechiul K s-a ajuns la noul K
* decrementand de Z ori, deci Z este numarul cautat pentru ca se pleaca de la sfarsitul
* ultimei subsecvente complete de dimensiunea noului K.
*/


#include <stdio.h>
#include <math.h>


#define RET -32000


float Ecuatie(float a, float b, float c)
{
/// Calculeaza radacina maxima a unei ecuatii de gradul 2.
float del = b * b - 4 * a * c;
if (del < 0) return RET; // solutii complexe
float x1 = (sqrt(del) - / (2 * a);
float x2 = c / a / x1; // bunicu' Viete
//fprintf(stdout, "%f %f\n", x1, x2);
x1 = x1 > x2 ? x1 : x2;
if (x1 < 0) return RET; // ambele negative
return x1;
}


int main()
{
/**
* Citim `k`.
* Il decrementam progresiv pana gasim solutie intreaga.
* Vedem de la ce numar am plecat.
* Il afisam, acesta apartinandu-i pozitiei `k`.
*/
printf("Introdu `k`: ");
int k, cnt;
for (scanf("%d", &k), cnt = 0; 1; --k, ++cnt) {
float res = Ecuatie(0.5, 0.5, -k);
if (res == RET) continue; // invalid root
if (res - (int)res == 0.0) { // daca avem radacina intreaga
// `k` reprezinta indexul unui ultimul element dintr-o serie
if (!cnt) cnt = res; // daca avem serii complete atunci afisam dimensiunea ultimei serii
printf("Elementul `k`: %d\n", cnt);
break;
}
}
return 0;
}

P.S.: Daca dai direct copy paste la cod fara sa citesti comentariile si sa bagi la cap atunci Starker chiar avea dreptate.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...