Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Amenintat cu moartea de un numar ...

La multi ani @AndReW99!

Alegere masina £15000 uk

TVR vrea sa lanseze o platforma d...
 Strategie investie pe termen lung...

Modulator FM ptr auto alimentat p...

orange cablu f.o. - internet fara...

Robinet care comuta traseul
 A fost lansata Fedora 40

Samsung S24 plus

Imi iau un Dell? (Vostro vs others)

Abonati Qobuz?
 transport -tren

Platforma electronica de eviden&#...

Cot cu talpa montat stramb in per...

Sfat achizitie sistem audio pentr...
 

[TEMA]Cea mai mare diferenta in modul

- - - - -
  • Please log in to reply
13 replies to this topic

#1
mojonono

mojonono

    Junior Member

  • Grup: Members
  • Posts: 27
  • Înscris: 30.05.2014
Se citeşte un şir de n numere întregi de la tastatură. Să se determine perechea de valori consecutive din şir care au diferenţa în modul maximă.
Ex: n=7
2, 17, 8, 21, 31, 40, 33
Rezultat: Cea mai mare diferenţă în modul este între valorile consecutive 2, 17 şi este egală cu 15.

Daca introduc n=3, si apoi 10 2 0, Imi afiseaza 10 si 0.

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
int n,i,a[20],maxim=0,x,y;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}

for(i=1;i<=n;i++)
if(abs(a[i]-a[i-1]>maxim))
{
	   maxim=abs(a[i]-a[i+1]);
	   x=a[i];
	   y=a[i-1];
}

if((abs(a[1]-a[n]>maxim)))
{
	 x=a[1];
	 y=a[n];
}
	 cout<<x<<' '<<y;

return 0;
}


Edited by mojonono, 11 February 2016 - 15:09.


#2
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 20,025
  • Înscris: 24.02.2006
tulburator.....

#3
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
Dacă începi cu i de la 1, atunci i-1 ce valoare are? Și ce se află pe acea poziție din a? Dacă termini când i este n, atunci i+1 ce valoare are? Și ce se află pe acea poziție din a? De ce pe o linie folosești i-1 și pe linia următoare i+1?

#4
Rhesus

Rhesus

    Senior Member

  • Grup: Senior Members
  • Posts: 2,884
  • Înscris: 22.04.2014
O întrebare simplă: De ce folosești un vector ? De ce sacrifici 20 * sizeof(int) ?

Un vector îl folosești când vrei să salvezi ceva în memorie. Te pune cineva să salvezi valorile citite ? Nu. Îți spune doar să evaluezi o diferență amărâtă și afișezi acei 2 termeni ai șirului pt. care această diferență amărâtă în modul e maximă. Ceva trebuie să salvezi, dar în niciun caz nu ai nevoie de 20*sizeof(int) ...

Gândește-te că pot veni cu 20000000 de numere....

Edited by Rhesus, 11 February 2016 - 15:31.


#5
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 20,025
  • Înscris: 24.02.2006
de fapt intrebari simple sunt cele puse de tavitu :). la nivelul asta cu te gandesti la optimizari?

#6
Rhesus

Rhesus

    Senior Member

  • Grup: Senior Members
  • Posts: 2,884
  • Înscris: 22.04.2014
Acuma am citit mai atent codul (in prima faza am abandonat cititul dupa declararea vectorului).

if(abs(a[i]-a[i-1]>maxim))
{
		 maxim=abs(a[i]-a[i+1]);


Daca diferenta dintre 17 si 2 (adica 15) este mai mare decat maxim, atunci maxim este diferenta dintre 17 si 8. Interesanta abordare ......

Explica te rog si:

if((abs(a[1]-a[n]>maxim)))
{
		 x=a[1];
		 y=a[n];
}
		 cout<<x<<' '<<y;


Primul element (care corect ar fi a[0]) - ultimul element a[n-1] ... Ce treaba are 7 cu 33 ? Sunt in capete opuse. Sunt consecutive?


E f. simpla problema (ia-o logic). Citesc primele 2 numere. Fac diferenta absoluta. Presupun ca e maxima. Salvez cele 2 elemente. Merg mai departe. Fac diferenta absoluta. E mai mare decat maxima ? Daca da, actualizez maxima si cele 2 elemente, daca nu merg mai departe. 3 randuri de cod. Daca depasesti 10 randuri de cod, ai luat-o pe calea gresita.

Edited by Rhesus, 11 February 2016 - 15:53.


#7
mojonono

mojonono

    Junior Member

  • Grup: Members
  • Posts: 27
  • Înscris: 30.05.2014

 Rhesus, on 11 februarie 2016 - 15:37, said:

Acuma am citit mai atent codul (in prima faza am abandonat cititul dupa declararea vectorului).

if(abs(a[i]-a[i-1]>maxim))
{
		 maxim=abs(a[i]-a[i+1]);


Daca diferenta dintre 17 si 2 (adica 15) este mai mare decat maxim, atunci maxim este diferenta dintre 17 si 8. Interesanta abordare ......

Explica te rog si:

if((abs(a[1]-a[n]>maxim)))
{
		 x=a[1];
		 y=a[n];
}
		 cout<<x<<' '<<y;


Primul element (care corect ar fi a[0]) - ultimul element a[n-1] ... Ce treaba are 7 cu 33 ? Sunt in capete opuse. Sunt consecutive?


E f. simpla problema (ia-o logic). Citesc primele 2 numere. Fac diferenta absoluta. Presupun ca e maxima. Salvez cele 2 elemente. Merg mai departe. Fac diferenta absoluta. E mai mare decat maxima ? Daca da, actualizez maxima si cele 2 elemente, daca nu merg mai departe. 3 randuri de cod. Daca depasesti 10 randuri de cod, ai luat-o pe calea gresita.

for(i=1;i<=n;i++)
	 if(abs(a[i]-a[i+1])>maxim)
{	 maxim=abs(a[i]-a[i+1]);
		 x=a[i];
		 y=a[i+1];
}



#8
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014

 Rhesus, on 11 februarie 2016 - 15:25, said:

O întrebare simplă: De ce folosești un vector ? De ce sacrifici 20 * sizeof(int) ?

Un vector îl folosești când vrei să salvezi ceva în memorie. Te pune cineva să salvezi valorile citite ? Nu. Îți spune doar să evaluezi o diferență amărâtă și afișezi acei 2 termeni ai șirului pt. care această diferență amărâtă în modul e maximă. Ceva trebuie să salvezi, dar în niciun caz nu ai nevoie de 20*sizeof(int) ...

Gândește-te că pot veni cu 20000000 de numere....

Presupunand dupa cum scrie codul ca e in liceu , atunci nu are treaba cu memoria si cu timpul de executie , sau cu cazul cand se citesc 109 numere . Uita-te , a citit vectorul de la 1 la n.

@ initiator

citesti vectorul de la 0 la n-1 si apoi faci ce a zis Rhesus . nu ai nevoie sa folosesti vector

for(i=1;i<=n;i++) {cin>>a ;
......

afisezi


# am editat acum . am crezut ca ii cere diferenta dintre oricare doua Posted Image)

Edited by VladBtz, 11 February 2016 - 16:28.


#9
aLexCM

aLexCM

    Active Member

  • Grup: Members
  • Posts: 1,079
  • Înscris: 26.01.2014
Mergi doar pana la n-1 ca-ti iese din vector.

@VladBtz Te complici. Vei ca j-ul pleaca de la i+1. Ai O(n2) acolo. Merge cu o singura parcurgere.

Edited by aLexCM, 11 February 2016 - 16:24.


#10
Cy_Cristian

Cy_Cristian

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 22.02.2009
@Vlad. Ce-ai facut tu acolo n-are nici un sens. Maxim modulul diferentei = max-min. Nu trebuie 2 parcurgeri. In plus, cerinta spune numere pe pozitii consecutive.

#11
mojonono

mojonono

    Junior Member

  • Grup: Members
  • Posts: 27
  • Înscris: 30.05.2014

 VladBtz, on 11 februarie 2016 - 16:19, said:

Presupunand dupa cum scrie codul ca e in liceu , atunci nu are treaba cu memoria si cu timpul de executie , sau cu cazul cand se citesc 109 numere . Uita-te , a citit vectorul de la 1 la n.

@ initiator

citesti vectorul de la 0 la n-1 si apoi faci ce a zis Rhesus . nu ai nevoie sa folosesti vector

for(i=1;i<=n;i++) {cin>>a ;
......

afisezi


# am editat acum . am crezut ca ii cere diferenta dintre oricare doua Posted Image)

Pai trebuie sa folosesc vector.
Nu inteleg de ce nu e bine asa
Fac diferenta,o atribui lui maxim,x devine primul element si y al doilea.

for(i=0;i<n-1;i++)
	 if(abs(a[i]-a[i+1])>maxim)
{	 maxim=abs(a[i]-a[i+1]);
		 x=a[i];
		 y=a[i+1];
}



#12
aLexCM

aLexCM

    Active Member

  • Grup: Members
  • Posts: 1,079
  • Înscris: 26.01.2014
E bine. Vezi sa citesti vectorul tot de la 0.

for(i=0;i<n;i++)
		cin>>a[i];



#13
Rhesus

Rhesus

    Senior Member

  • Grup: Senior Members
  • Posts: 2,884
  • Înscris: 22.04.2014
Nu trebuie sa folosesti vector. Lasa tampeniile pe care ti le spune profesorul la clasa. Gandeste in felul tau problema!

Nu te limita la liceu, sau la cum ati facut la clasa. Rezolva problema asa cum crezi tu de cuviinta. Incearca sa rezolvi problema cat mai eficient, chiar daca nu-ti cere nimeni.

Initializeaza maxim cu -1. De ce nu cu 0 ? Astept raspunsul. Hint: Vezi cazul: 17 17 17 17 17 17 17 cu x si y neinitializati si cu maxim initializat cu 0 (nu cu -1). Ce se intampla?

int nr_elemente, maxim, current, next, elem1, elem2, dif;
cin >> nr_elemente >> current; // citesc nr. elemente, precum si pe primul element
maxim = -1; // initializez maxim cu -1 (pt. a evita cazul 17 17 17 17 17 ...)
for (int i=0; i<nr_elemente-1; i++){
cin >> next; // citim urmatorul element
dif = abs(current-next); // calculam diferenta ca sa nu apelam de doua ori abs
if (dif>maxim){ // daca diferenta este mai mare decat maxim
maxim = dif; // actualizam noul maxim
elem1 = current; // precum si primul
elem2 = next; // si al doilea element
}
current = next; // noi intotdeauna citim next, deci actualizam current pt. un viitor ciclu
}


Scuze de indentare, e facut pe ideone.com iar copy-paste-ul e bullshit.

Aloci in memorie 8 * sizeof(int) adica, 32 de bytes. Dacă ai avea nr_elemente 1 milion, și ai vrea să salvezi într-un vector 1 milion de numere, ai avea nevoie de 4MB...

Edited by Rhesus, 11 February 2016 - 17:30.


#14
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,437
  • Înscris: 10.08.2005
ce vrea @Rhesus sa spuna este ca problema asta se rezolva la citire

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate