Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- /*
- Am eliminat posibilitatile de genul 1 2 1 , 2 1 1, 1 1 2
- E bazat pe un vector de pointer
- Am sortat reperele si dupa am lucrat cu ajutoul vectroului de pointeri
- Am optimizat memoria mult, si numarul de cazuri posibile l-am redus
- Sper ca e bine ca am eliminat cazurile de la inceput.
- */
- int main() {
- unsigned short L, suma, i, varf, stiva[1001], nrFel = 0; // Lungigime numar de repre varf deoarece utilizam principi din stiva, si un vector de pointeri
- FILE *f; // variabila de tip fiser
- scanf("%hu", &L); // citim lungimea si numarul de repere
- fclose(f);// inchidem fiserul
- // Se pot aloca vectori de pointer dinamic? pentru ca avem nevoie de o stiva de L/repere[1] + 2 si sa nu fac risipa
- suma = 1;// initializari
- varf = 1;
- stiva[0] = 0; // sa nu am eroare cand varf = 0
- stiva[varf] = 1;// initializari
- f = fopen("out.txt", "w");
- while (varf) { // se opreste cand stiva este goala
- if (suma < L && stiva[varf] < 101) {// daca suma este mai mica adaugam adresa varfului la varf urmator si adunam la suma
- stiva[varf + 1] = stiva[varf] + 1;
- suma += stiva[++varf];
- }// adauagm adresa elementului curent pana suma este >= L
- else { // altfel
- if (suma == L) { // daca suma = L si functia de valid returneaza 1 se afiseaza
- for (i = 1; i <= varf; i++)
- fprintf(f, "%hu ", stiva[i]);// afisam elementele de la adresele indicate de st
- fprintf(f, "\n");
- nrFel++;
- }
- suma -= stiva[varf--]; // scadem din suma actual varf dupa care scadem varful
- suma -= stiva[varf]; //scadem din suma noul varf
- stiva[varf]++; //se incrementeaza valoarea din varf
- suma += stiva[varf]; // se adaauga noua valaore
- }
- }
- fclose(f);
- printf("Se pot aranja in %d feluri", nrFel);
- scanf("%*c");
- return 0;
- }
Add Comment
Please, Sign In to add comment