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

Două numere naturale sunt numite z-prietene dacă au aceeași cifră a zecilor.
Fișierul bac.in conține un șir de cel mult 10⁶ numere naturale din intervalul [10,10⁹], separate prin
câte un spațiu. Se cere să se afișeze pe ecran pozițiile din șir pe care se află termeni precedați de un
număr maxim de valori z-prietene cu ei. Numerele afișate sunt separate prin câte un spațiu. Proiectați
un algoritm eficient din punctul de vedere al timpului de executare.
Exemplu: dacă fișierul conține numerele 726 358 98 157 20 49 128 879 659 271
pe ecran se afișează numerele 7 9 (termenii 128, respectiv 659 respectă proprietatea cerută).
a. Descrieți în limbaj natural algoritmul proiectat, justificând eficiența acestuia.
b. Scrieți programul C/C++ corespunzător algoritmului proiectat.

Răspunsuri la întrebare

Răspuns de boiustef
12

Răspuns:

#include <iostream>

#include <fstream>

using namespace std;

ifstream f("bac.in");

int num, vf[10], z, n, poz[10];

int main()

{

   while (f >> num) {

       ++n;

       z=(num/10)%10;

       ++vf[z]; poz[z]=n;

   }

   int m=0;

   for (int i=0; i<10; i++) {

       if (vf[i]>m) m=vf[i];

   }

   for (int i=0; i<10; i++) {

       if (vf[i]==m) {

           cout << poz[i] << " ";

       }

   }

   return 0;

}

Explicație:

Paralel cu citirea numerelor din fișier se completează vectorul frecvenței cifrei zecilor și poziția numărului citit în șir.

Se determină valoarea maximă din vectorul frecvenței

Se afișează pozițiile numerelor în șir cu cele mai multe z-prietene


alexmihairomanp8apni: Randul 25 de programare.
"" int m=0;"" trebuie inlocuit cu m=2 caci cerinta vorbeste de 2 numere z-prietene. deci in vectorul de frecventa trebuie sa avem neaparat 3 aparitii ale unei zecimale . Altfel programul ar putea afisa si 10 ( pentru nr 271), caci in fisier apare si 879. ( in cazul in care am avea maxim 2 aparatii pentru fiecare zecimala). Uite un desfasurator al continutului vectorilor.
alexmihairomanp8apni: Cam asa arata continutul vectorilor. Deci daca numarul de aparitii maxim ar fi 2 atunci s-ar afisa ultimul numar din frecventa. Lucru care este gresit. Ai nevoie de 2 vecini si dupa un al 3-lea numar.Vf[0]=0 ;Vf[1]= 0; Vf[2]=3; Vf[3]=0; Vf[4]=1; Vf[5]=3; Vf[6]=0; Vf[7]=2; Vf[8]=0 ;Vf[9]=1
poz[0]=0; poz[1]=0 ;poz[2]=7; poz[3]=0 ;poz[4]=6; poz[5]=9; poz[6]=0 ;poz[7]=10; poz[8]=0 ;poz[9]=3;
Alte întrebări interesante