rocket92 Posted March 6, 2012 Report Posted March 6, 2012 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 ctrei numere întregi, a ? 0, de cel mult patru cifre fiecare, reprezentând coeficien?ii ecua?iei degradul 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 celpu?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 cese 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, prinapeluri utile ale func?iei Ecuatie, definite la punctul 3, determin? valoarea elementului cese afl? pe pozi?ia k în ?irul s, folosind un algoritm eficient din punctul de vedere al spa?iuluide memorie alocat ?i al timpului de executare. Valoarea astfel determinat? se va scrie înfi?ierul text sir.out. (6p.) Descrie?i succint, în limbaj natural, metoda de rezolvare folosit?, explicând în ce const?eficien?a ei (3 – 4 rânduri) (4p.) Quote
Starker Posted March 6, 2012 Report Posted March 6, 2012 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... Quote
cmiN Posted March 6, 2012 Report Posted March 6, 2012 @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 -32000float 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. Quote