Rezolvare completă PbInfo #1443 control2

Gigel a primit spre păstrare un set de n cutii de greutăţi nu neapărat distincte. El a cântărit cutiile şi pentru fiecare greutate distinctă a notat pe o foaie, în ordine crescătoare a greutăţilor, numărul de cutii cu greutatea respectivă.
Deoarece fratele său mai mic avea prostul obicei să se joace cu numerele scrise de el pe foaie, Gigel s-a gândit să calculeze un „număr de control” după următorul algoritm: începând de la primul număr a grupat numerele de apariţii ale greutăţilor câte trei (dacă îi rămân numere negrupate la sfârşit, le ignoră). Dacă într-un grup sunt numai numere pare sau numai impare notează grupul cu cifra 1, altfel îl notează cu cifra 0. Din şirul astfel obţinut, se formează un număr care are ca valoare cifra zecilor egală cu numărul de valori 1 şi cifra unităţilor egală cu numărul de valori 0, obţinându-se astfel „numărul de control”.

Cerința

Citind greutăţile cutiilor, să se determine „numărul de control” şi să se verifice dacă este număr prim.

Date de intrare

Pe prima linie a fişierului de intrare control2.in se găseşte numărul natural n, iar pe următoarele n linii câte un număr natural, reprezentând greutăţile celor n cutii.

Date de ieșire

Fişierul control2.out va conţine pe prima linie „numărul de control”, urmat, pe linia a doua, de valoarea 0 sau 1. Pe linia a doua se va afişa 1 dacă numărul este prim, respectiv 0 în caz contrar.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • fiecare greutate este un număr natural, mai mic sau egal cu 200

Exemplu

control2.in

21
1 
3 
2 
6 
2 
6 
2 
8 
9 
8 
8 
9 
10 
8 
11 
18 
11 
12 
14 
15 
17

control2.out

31
1

Explicație

După ordonare se obţine şirul: 1 2 2 2 3 6 6 8 8 8 8 9 9 10 11 11 12 14 15 17 18
Se obţine apoi \(\underset{1}{\underbrace{1 3 1}}\) \(\underset{1}{\underbrace{2 4 2}}\) \(\underset{0}{\underbrace{1 2 1}}\) \(\underset{1}{\underbrace{1 1 1}}\) \(1\).
Din valorile 1 1 0 1 se obţine numărul de control 31, care este număr prim.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema control2:

#include <fstream>

using namespace std;

ifstream fin("control2.in");
ofstream fout("control2.out");

int main(void)
{
    int greutati[100], numarGreutati, aparitii[100], numarApariti=0, numarControl=0, elementeSumaControl[2], estePrim = 1;
    elementeSumaControl[0] = elementeSumaControl[1] = 0;


    /* citirea greutatilor */
    fin >> numarGreutati;
    for (int i = 0; i < numarGreutati; i++) {
        fin >> greutati[i];
    }

    /* ordonarea crescatoare a acestora */
    for (int i = 0; i < numarGreutati - 1; i++) {
        for (int j = i + 1; j < numarGreutati; j++) {
            if (greutati[i] > greutati[j]) {
                int aux = greutati[i];
                greutati[i] = greutati[j];
                greutati[j] = aux;
            }
        }
    }

    /* le grupam dupa numarul de aparitii */
    {
        int i = 0;
        while(i < numarGreutati) {
            int count = 1;
            if (greutati[i] == greutati[i+1]) {
                while (greutati[i] == greutati[i+1] && i < numarGreutati) {
                    count++;
                    i++;
                }
            }
            aparitii[numarApariti++] = count;
            i++;
        }
    }


    /* parcurgem greutatile cate 3 */
    for(int i = 0; i < numarApariti / 3 * 3; i += 3) {
        elementeSumaControl[aparitii[i] % 2 == aparitii[i + 1] % 2 && aparitii[i] % 2 == aparitii[i + 2] % 2]++;
    }

    /* construim numarul de contorl */
    numarControl = elementeSumaControl[0] + elementeSumaControl[1] * 10;

    /* verificam daca este prim */
    if (numarControl % 2==0)
    {
        estePrim = (numarControl == 2);
    }
    else
    {
        for(int d = 3; d * d <= numarControl; d += 2) {
            if(numarControl % d == 0) {
                estePrim = 0;
                break;
            }
        }
    }

    fout << numarControl << '\n' << estePrim;

    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1443 control2

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1443 control2 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!