Răspuns :
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ă...
Vă mulțumim pentru vizita pe site-ul nostru dedicat Informatică. Sperăm că informațiile oferite v-au fost de ajutor. Nu ezitați să ne contactați pentru orice întrebare sau dacă aveți nevoie de asistență suplimentară. Vă așteptăm cu drag data viitoare și nu uitați să ne adăugați la favorite!