# PBinfo #4348 – chei – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Gigel a descărcat pe telefon un joc nou. Jocul are mai multe camere. Pentru a trece dintr-o cameră a jocului în următoarea cameră este nevoie de o cheie potrivită, care va deschide ușa ei. La începutul jocului se cunosc două chei digitale, ce reprezintă două numere naturale. Cu aceste chei se vor deschide ușile primelor două camere. Pentru a afla cheia ce deschide ușa unei camere următoare, Gigel utilizează ultimele două chei din joc, pe care le notează c1 și c2. Cu aceste chei va obține un număr nou, notat c, care conține ultima cifră din c1 și prima cifră din c2, în această ordine. Dacă cheia c1 se termină cu cifra zero, c va fi egal cu prima cifră din c2. Dacă numărul c este număr prim, va reprezenta cheia cu care se va deschide ușa camerei pentru a trece în altă cameră a jocului. Dacă numărul c nu este prim, cheia camerei va fi egală cu diferența obținută prin scăderea din numărul c a factorilor lui primi. Dacă c este egal cu 1, cheia camerei va fi numărul 1. Jocul se termină când ultima cheie obținută este egală cu una dintre ultimele trei chei utilizate exact înaintea ei.

Cerința
Cunoscând primele două chei ale jocului, notate x și y, să se obțină și să se afișeze șirul format din cheile camerelor din joc, în ordinea utilizării lor, până la terminarea jocului.

Date de intrare
Fișierul de intrare chei.in conține pe prima linie două numere naturale x și y ce reprezintă primele două chei digitale din joc.

Date de ieșire
Fișierul de ieșire chei.out va conține un șir de numere naturale, separate prin spațiu ce reprezintă cheile utilizate pentru deschiderea ușilor camerelor, în ordinea obținerii lor, până la terminarea jocului. Primele două numere din acest șir sunt egale cu primele două chei digitale care se află în fișierul de intrare.

Restricții și precizări

1 < x, y ≤ 999
Pentru o cheie digitală c < 10, prima și ultima cifră a sa sunt egale cu c
Jocul lui Gigel are cel puțin 3 camere și cel mult 100 de camere
Ultima cheie obținută pentru joc, care coincide cu una dintre ultimele trei chei utilizate exact înaintea ei, nu se afișează.

Exemplul 1:
chei.in

20 72
chei.out

20 72 7 24 67 21
Explicație
Primele două chei din joc sunt 20 și 72. Cu acestea se obține numărul 7 care este prim și reprezintă cheia următoare din joc.
Din cheile 72 și 7, se obține numărul 27 care nu este prim și are factor prim pe 3. Cheia următoare este egală cu valoarea diferenței 27 - 3 = 24.
Din cheile 7 și 24 se obține numărul 72 care nu este prim și are factorii primi 2 și 3. Cheia nouă este egală cu 72 - 2 - 3 = 67.
Din cheile 24 și 67 se obține numărul 46 care nu este prim și are factorii primi 2 și 23. Cheia nouă este egală cu 46 - 2 - 23 = 21.
Din cheile 67 și 21 se obține numărul 72 care nu este prim și are factorii primi 2 și 3. Cheia nouă este egală cu 72 - 2 - 3 = 67. Această cheie coincide cu una dintre ultimele trei chei utilizate în joc: 24, 67 și 21. Jocul se termină și această ultimă cheie nu se afișează.

Exemplul 2:
chei.in

20 17
chei.out

20 17 1 71
Explicație
Primele două chei din joc sunt 20 și 17. Cu acestea se obține numărul 1 care este cheia următoare din joc.
Din cheile 17 și 1 se obține numărul 71 care este prim și reprezintă cheia următoare.
Din cheile 1 și 71 se obține numărul 17 care este prim și a fost utilizat deja, jocul se termină și această ultimă cheie nu se afișează.

## Cod sursă C++

```cpp
#include <fstream>
#include<iostream>
using namespace std;
int ciur[101]; //fac numere doar de 2 cifre deci pot sa iau in considerare doar numerele pana la 100
ofstream fout("chei.out");
ifstream fin("chei.in");
int main()
{
    int x,y,s,d,c,nr=0,i,j,cx,n;
    ciur[0]=ciur[1]=1;
    for(i = 2; i <= 101; i++)
    {
        if(ciur[i] == 0)
        {
            for(j = 2 * i; j <= 101; j = j + i)
            {
                ciur[j] = 1; //nu e prim
            }
        }
    }
//Cheile pot avea si o singura cifra...ex:4120 si 35 vor forma cheia 3. La fel se intampla si pentru cazul 30 si 19
    fin>>x>>y;
    fout<<x<<' '<<y<<' ';
    int k=2;
    int ok=1;
    while(ok==1)
    {
        c=y;
        nr=0;
        while(c>=10) c=c/10;
        nr=(x%10)*10+c;
        if(ciur[nr]==1) //daca numarul obtinut nu este prim
        {
            s=0;
            for(d=2; d<=nr/2; d++)
                if(nr%d==0 && ciur[d]==0)
                    s+=d;
            nr=nr-s;
        }
        if(cx==nr || nr==x || nr==y || k==10000) ok=0;
        k++;
        if(ok==1)
            fout<<nr<<' ';
        cx=x;
        x=y;
        y=nr;
    }
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/4348)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/4348/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-4348/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
