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

Hey lume, am si eu nevoie de ajutor la problema 95 de pe poza atasata:

Anexe:

Răspunsuri la întrebare

Răspuns de daba
1

Răspuns:

Din moment ce ai spus ca ai nevoie de ajutor la problema aia, eu consider ca vrei o indicatie, nu program c++. Deci ai face asta in felul urmator.

Explicație:

Citesti acel r intr-un vector de caractere, adica ai ceva de genul char r[20]

Cauti cu un i care pleaca de la strlen(r) - 1 pana la 0 sau pana gasesti punct, numarand cate zecimale sunt (strlen(r) -1 pt ca strlen(r) numara si acel '\0')

Sa cauti si cate numere sunt pana la zecimale, te va ajuta mai incolo (sa numeri si punctul)

Daca sunt mai multe zecimale decat n, atunci faci for de la strlen(r) -1 si stergi zecimalele in plus, punand '\0' cu grija unde trebuie pus, astfel incat sa ai exact n zecimale

Altfel

Faci for de la strlen(r) pana la n + cate numere ai pana la zecimale, incluzand punctul (sa ai grija sa pui '\0' unde trebuie, adica la n + w/e + 1)

Faci iar for ca sa gasesti punctul si ii tii minte pozitia

Faci din nou for de la 0 pana la pozitia punctului - n + 1 si tai ce e pana acolo, adica tragi tot vectorul in stanga cu o pozitie de fiecare data (adica elimini prima pozitie) si scazi acel iterator din for, adica i cu 1 si scazi si pozitia punctului cu 1 (pentru ca tu cand afisezi, ei vor triunghi, deci nu ai ce sa faci decat sa tai ce e inainte)

Acum punctul tau ar trebui sa fie exact in mijloc -1 daca strlen(r) % 2 == 0 (adica daca e impara lungimea, pentru ca numara si '\0') sau in exact r[strlen(r) % 2] daca strlen(r)%2 == 1 (pentru ca jumatatea ar fi fix in mijlocul vectorului si cum tu calculezi jumatatea cu un int, ala o sa fie rotunjit de la... 4.5 la 4 (evident, asta e un exemplu))

Creezi o variabila de tip int poz(de exemplu), pe care o initializezi cu pozitia punctului si inca o variabila int move = 0.

Acum tu afisezi intr-un triple for piramida in complexitate O(n log n) modul urmator:

Primul for se duce de la 0 pana la n.

In acel prim for ai un al doilea for in care afisezi de poz ori caracterul ' ' (adica space)

Afisezi r[poz - move]

Daca move != 0

Afisezi de move ori spatiu cu un al 3-lea for in primul for si dupa afisezi r[poz + move]

inainte sa inchizi primul for, cresti move cu 1

Acum ar trebui sa fie gata si sa faca ce ai vrea. Da comm daca ti se pare ca am gresit ceva sau daca ai nelamuriri.


daba: Evident ca daca vrei neaparat alocare dinamica a r - ului, dai char *r = '\0' si folosesti operatorul new, citind intr-o alta variabila p de tip char un caracter, copiezi r-ul vechi untr-un alt pointer x alocat dinamic cu new[strlen(r)], apoi dai r = new char[strlen(x) + 1], apoi copiezi tot ce aveai in x cu strcpy(r, x), dupa aia r[strlen(x)] = caracterul p citit si apoi dai r[strlen(x) + 1] = '\0'.
daba: In final dai delete []x; pentru a sterge vectorul x alocat dinamic. Vectorul r va fi safe daca ai lucrat cum ti-am zis cu el si nu va pointa catre x. In cele din urma r nu va fi sters de catre delete cand stergi x.
Fluffy133: Ms mult, in sfarsit cnv care stie cum sa explice XD.
daba: Np, trying my best.
Alte întrebări interesante