Informatică, întrebare adresată de theo166, 8 ani în urmă

1. Se citeşte de la tastatură un număr natural x de cel mult 9 cifre. Se cere să se determine toate numerele care se pot obţine adăugând prima cifră la sfârşitul numărului.

Exemplu: dacă x =67324 se obține următorul şir de numere: 73246, 32467, 24673, 46732, şi 67324.

2. Se citeşte de la tastatură un număr natural x de cel mult 9 cifre. Se cere să se determine dacă numărul are aspect de ,,deal" sau de ,,vale".

Exemplu 1: dacă x =12321 se va afișa
DEAL!, cifrele urcă până la 3, după care coboară

Exemplu 2: dacă x =32123 se va afișa:
VALE!, cifrele numărului coboară până la 1, după care urcă

va rog sa ma ajutati macar la una dintre probleme daca nu stiti la ambel; puteti rezolva in C++ sau in pseudocod, cum va e mai usor!

ofer coroană si ce mai vreti voi;))​​

Răspunsuri la întrebare

Răspuns de ovdumi
1

Răspuns:

1. #include <iostream>

using namespace std;

int main()

{

int x, cx, C = 0, pc, i, f = 1;

cin >> x;

cx = x;

while (cx != 0)

{

 C++;

 cx = cx / 10;

}

cx = x;

for (i = 1; i < C; i++)

 f = f * 10;

for (i = 1; i < C; i++)

{

 pc = cx / f;

 cx = cx % f;

 cx = cx * 10 + pc;

 cout << cx << " ";

}

cout << x << " ";

   return 0;

}

2. #include <iostream>

using namespace std;

int main()

{

int x, cx, max = 0, min = 10, deal = 1, vale = 1, v[9], i, rast = 0, imax, imin, j;

cin >> x;

cx = x;

while (cx != 0)

{

 rast = rast * 10 + cx % 10;

 cx = cx / 10;

}

for (j = 1; j <= 9 && rast != 0; j++)

{

 v[j] = rast % 10;

 rast = rast / 10;

 if (v[j] > max)

 {

  max = v[j];

  imax = j;

 }

 if (v[j] < min)

 {

  min = v[j];

  imin = j;

 }

}

j = j - 1;

if (imax == 1 || imax == j)

 deal = 0;

if (imin == 1 || imin == j)

 vale = 0;

for (i = 1; i < imax && deal == 1; i++)

{

 if (v[i] > v[i + 1])

  deal = 0;

}

for (i = imax + 1; i < j && deal == 1; i++)

{

 if (v[i] < v[i + 1])

  deal = 0;

}

for (i = 1; i < imin && vale == 1; i++)

{

 if (v[i] < v[i + 1])

  vale = 0;

}

for (i = imin + 1; i < j && vale == 1; i++)

{

 if (v[i] > v[i + 1])

  vale = 0;

}

if (deal == 1)

 cout << "DEAL!" << endl;

else

{

 if (vale == 1)

  cout << "VALE!" << endl;

 else cout << "NICI DEAL, NICI VALE!" << endl;

}

   return 0;

}

Explicație:

Te rog sa urmaresti cu atentie explicatiile acestor probleme daca ai nelamuriri, iar daca se intampla sa nu iti raspunda la intrebari, intreaba-ma pe chat.

La prima problema am calculat, in prima faza, numarul de cifre ale lui x. L-am memorat pe x in cx (o copie a lui x) pentru a nu pierde continutul ei, intrucat trebuie afisat ultimul (asa reiese din exemplul tau). Apoi variabila f ia practic valoarea 10^(C-1), astfel ca numarul de zerouri ale lui f este egal cu nr de cifre (adica C) - 1. Astfel, impartim pe cx (adica x) la f, ca sa extragem prima cifra a acestuia (in variabila pc). Dupa aceea, eliminam prima cifra a lui cx prin instructiunea cx = cx % f, deoarece aceasta trebuie sa apara la final. Inmultim pe cx (care acum si-a pierdut prima cifra) cu 10, dupa care adunam la acesta prima cifra si il afisam. Procedam asa de C-1 ori, deoarece in total trebuie sa afisam atatea numere cate cifre are numarul initial. Astfel, la final, il afisam pe x, care a ramas intact pe tot parcursul executiei programului.

La a doua problema in schimb e mai complicat. Pentru a-mi usura munca, am memorat toate cifrele lui x intr-un vector, deoarece este mai usor sa compar cifrele sale, sa vad ce si cum. Astfel, am calculat la inceput rasturnatul lui x si apoi am inceput sa memorez in vector cifrele numarului. Aici e partea interesanta. Primul element din vector (adica v[1]) memoreaza ultima cifra a rasturnatului lui x, care este chiar prima cifra a lui x. Continuam tot asa pana cand toate cifrele lui x (sau ale rasturnatului sau) au fost memorate in vector. Variabila j, care este contorul, s-a micsorat cu 1, deoarece, la finalul executiei structurii for, este cu 1 mai mare decat nr de cifre ale lui x. Intre timp, am memorat in max si min cea mai mare, respectiv cea mai mica cifra a lui x, si de asemenea indicele acestora (imin si imax). Daca unul dintre ele (adica min si max) este 1 sau j (adica prima sau ultima cifra a lui x), unul dintre semafoarele deal si vale se face 0, deoarece valoarea minima/maxima nu are nicio valoare in stanga/dreapta ei, deci nu poate forma un "deal"/"vale". Dupa aceea, am verificat pentru ambele cazuri daca respecta structura unui numar cu aspect "deal" sau "vale". Aici nu cred ca vei avea probleme in a intelege cum am procedat. La final, daca deal este 1, atunci numarul x este "deal". In schimb, daca vale este 1, inseamna ca x este "vale". Totusi, daca ambele sunt 0, atunci x nu este nici "deal", nici "vale".


theo166: multumesc mult pentru raspuns si explicatii! apreciez enormmm
theo166: prima problema am inteles-o, in schimb la a 2a noi nu am lucrat deloc cu vectori pana acum, dar daca asta e cea mai simpla varianta, e ok!
ovdumi: un vector memoreaza mai multe valori de acelasi tip si daca avem nevoie, de exemplu, de valoarea memorata pe a cincea pozitie din vector, folosim notatia v[5]
ovdumi: vectorii nu sunt foarte grei, la problema asta de exemplu trebuie sa stii numai notiunile de baza, care sunt destul de usoare
theo166: ok, am inteles acum, multumeesc mult!
ovdumi: cu placere
theo166: Hei! Am postat 2 intrebari noi la informatica, ai putea sa ma ajuti, te rog frumos?
Alte întrebări interesante