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

#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
Din valorile 1 1 0 1 se obţine numărul de control 31, care este număr prim.
Acesta este codul meu de 0 puncte .
#include
#include
#include
using namespace std;
ifstream f("control2.in");
ofstream g("control2.out");
int n, i, sir1[100], sir2[100], nr_elem_consecutive, element_sir_2 = 0, sir3[100];
int d, suma = 0, cifre_d_zero = 0 , cifre_d_unu = 0;


bool doar_pare_sau_impare (int a, int b, int c)
{
if (a % 2 and b % 2 and c % 2)
return true;
if (a % 2 == 0 and b % 2 == 0 and c % 2 == 0)
return true;
return false;
}


bool prim(int numar)
{
if (numar%2 == 0)
{
if (numar == 2)
return true;
return false;
}
else
{
for (int divizor = 3 ; divizor <= sqrt(numar) ; divizor += 2)
if (numar % divizor == 0)
return false;
return true;
}
}


int main()
{
f >> n;
for (i=0 ; i < n ; i++) f >>sir1[i];
sort(sir1, sir1 + n);
for (i=0 ; i < n ; i++)
{
nr_elem_consecutive = 1;
if (sir1[i] == sir1[i+1])
{
while (sir1[i] == sir1[++i])
nr_elem_consecutive++;
i--;
}
sir2[element_sir_2++] = nr_elem_consecutive;
}
while ((element_sir_2+1) % 3 != 0)
element_sir_2--;
while (suma <= element_sir_2)
if (doar_pare_sau_impare(sir2[suma++], sir2[suma++], sir2[suma++]))
cifre_d_unu++;
else
cifre_d_zero++;
if (cifre_d_unu != 0 and cifre_d_zero != 0)
d = cifre_d_unu * 10 + cifre_d_zero;
else
{
if (cifre_d_unu == 0)
d = cifre_d_zero;
else
d = cifre_d_unu;
}
g << d << '\n';
if (prim(d))
g << 1;
else
g << 0;
return 0;
}


boiustef: la bool prim iara nu tii cont de valorile 1 pe care codul tau le va considera prime ...
pmarian98: Am uitat de else sau...
pmarian98: acuma merge dar am la toate depasire de timp
boiustef: am eu codul de 100, numai ce l-am testat
boiustef: vezi, cu vectorul de frecventa cu mult e mai simplu ...
boiustef: nici nu tr de sortat

Răspunsuri la întrebare

Răspuns de boiustef
1

#include <iostream>

#include <fstream>

using namespace std;

short fr[201], n, i, ap[201], k, num, nrcontrol;

ifstream f("control2.in");

ofstream g("control2.out");

bool prim(short m)

{

   short p=1;

   if (m==0 || m==1) p=0;

   if (m==2) p=1;

   if (m>2)

   {

      if (m>2)

      {

          if (m%2==0) p=0;

          for (int j=3; j*j<=m; ++j)

          {

              if (m%j==0) { p=0; break; }

          }

      }

   }

   if (p) return 1;

   else return 0;

}

int main()

{

  f >> n;

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

  {

      f >> num; ++fr[num];

  }

  for (i=0; i<=200; ++i)

  {

     if (fr[i]) { ++k; ap[k]=fr[i]; }

  }

  while (k%3) --k;

  short unu=0, zero=0;

  for (i=1; i<=k-2; i+=3)

  {

      if ((ap[i]%2 && ap[i+1]%2 && ap[i+2]%2) || (ap[i]%2==0 && ap[i+1]%2==0 && ap[i+2]%2==0)) ++unu;

      else ++zero;

  }

  nrcontrol=unu*10+zero;

  g << nrcontrol << "\n";

  g << prim(nrcontrol);

}


boiustef: am mai facut un vector ap in afara de cel de frecventa sa le pun alaturi ca sa nu caut prin cel de frecventa trei alaturate nenule, cu toate ca se putea..
pmarian98: DE CE DE 2ORI if (m>2)
boiustef: e adaugat din greseala ...
boiustef: nu modifica nimic... se poate lichida
Alte întrebări interesante