fbpx

Problema #3432 – Tai – Rezolvari PBInfo

de Mihai-Alexandru

Un număr este prim dacă are exact doi divizori naturali. Prin tăierea unui număr în p părți înțelegem împărțirea acestuia în p numere, fiecare de cel puțin o cifră, astfel încât prin alipirea numerelor obținute de la stânga la dreapta obținem numărul inițial.

De exemplu, dacă împărțim numărul 12045 în două părți avem patru variante de tăiere obținându-se numerele: 1 și 2045; 12 și 045; 120 și 45; 1204 și 5. Dacă îl împărțim în trei părți avem șase variante de tăiere obținându-se numerele 1, 2 și 045; 1, 20 și 45; 1, 204 și 5; 12, 0 și 45; 12, 04 și 5; 120, 4 și 5.

Cerința

Se consideră un șir format din N numere naturale.

1) Determinați cel mai mare număr prim din șirul celor N numere.

Un număr este prim dacă are exact doi divizori naturali. Prin tăierea unui număr în p părți înțelegem împărțirea acestuia în p numere, fiecare de cel puțin o cifră, astfel încât prin alipirea numerelor obținute de la stânga la dreapta obținem numărul inițial.

De exemplu, dacă împărțim numărul 12045 în două părți avem patru variante de tăiere obținându-se numerele: 1 și 2045; 12 și 045; 120 și 45; 1204 și 5. Dacă îl împărțim în trei părți avem șase variante de tăiere obținându-se numerele 1, 2 și 045; 1, 20 și 45; 1, 204 și 5; 12, 0 și 45; 12, 04 și 5; 120, 4 și 5.

Cerința

Se consideră un șir format din N numere naturale.

1) Determinați cel mai mare număr prim din șirul celor N numere.
2) Determinați cel mai mare număr prim dintre cele obținute prin tăierea în două părți a fiecărui număr din șirul celor N.
3) Determinați cel mai mare număr prim dintre cele obținute prin tăierea în trei părți a fiecărui număr din șirul celor N.

Date de intrare

Fișierul de intrare tai.in conține pe prima linie numărul C care poate avea doar valorile 1, 2 sau 3 și reprezintă cerința care urmează a fi rezolvată. Pe a doua linie se găsește N, cu semnificația din enunț, iar pe a treia linie se găsește șirul celor N numere naturale despărțite prin câte un spațiu.

Date de ieșire

Fișierul de ieșire tai.out va conține pe prima linie un număr natural reprezentând răspunsul la cerința specificată.

Restricții și precizări

  • 1 ≤ N ≤ 100
  • 0 ≤ orice număr din șir ≤ 1000000000
  • Pentru cerințele 2 și 3 se garantează că pentru toate numerele din șir se poate efectua tăierea
  • Pentru cerința 1 dacă șirul nu conține numere prime se va afișa 0
  • Pentru cerințele 2 și 3 dacă în urma tăierilor nu se obține niciun număr prim, se va afișa 0
  • În concurs, pentru rezolvarea fiecărei cerințe s-au obținut 30 de puncte. Pe site se acordă 10 puncte pentru exemple.

Exemplul 1

tai.in

1
5
2 13 21 17 1

tai.out

17

Explicație

Numere prime din șir sunt 2, 13 și 17, iar maximul este 17.

Exemplul 2

tai.in

2
3
23 196 27

tai.out

19

Explicație

Din 23 se obțin două numere 2 și 3, din 196 se pot obține numerele 1 și 96 sau 19 și 6, iar din 27 se obțin numerele 2 și 7. Cel mai mare număr prim care se poate obține este 19.

Exemplul 3

tai.in

3
3
1234 17119 5678

tai.out

71

Explicație

Din numărul 1234 se pot obține numerele: 1, 2, 34 sau 1, 23, 4 sau 12, 3, 4.

Din numărul 17119 se pot obține numerele: 1, 7 și 119 sau 1, 71 și 19 sau 1, 711 și 9 sau 17, 1 și 19 sau 17, 11 și 9.

Din numărul 5678 se pot obține numerele: 5, 6 și 78 sau 5, 67 și 8 sau 56, 7 și 8.

Cel mai mare număr prim care se poate obține este 71.

#include <bits/stdc++.h>
using namespace std;

ifstream cin("tai.in");
ofstream cout("tai.out");

int n , x , cer , rez , maxi , maxi1;

int prim (int n)
{
    if(n == 0 || n == 1) return 0;
    if(n == 2) return 1;
    if(n % 2 == 0) return 0;
    for(int i = 3 ; i * i <= n ; i += 2)
        if(n % i == 0) return 0;
    return 1;
}

void desc(int x)
{
    int aux = x , p = 1 , c = 0;
    while(x != 0)
    {
        c = (x % 10) * p + c;
        x /= 10;
        p *= 10;
        if(prim(x))
        {
            if(x > maxi1 && aux != x) maxi1 = x;
        }
        if(prim(c))
        {
            if(c > maxi1 && aux != c) maxi1 = c;
        }
    }
}

int main()
{
    cin >> cer >> n;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> x;
        if(prim(x)) if(x > rez) rez = x;
        int aux = x , p = 1 , c = 0;
        while(x != 0)
        {
            c = x % 10 * p + c;
            x /= 10;
            p *= 10;
            desc(x);
            if(c != aux)desc(c);
            if(prim(x))
            {
                if(x > maxi && aux != x) maxi = x;
            }
            if(prim(c))
            {
                if(c > maxi && aux != c) maxi = c;
            }
        }
    }
    if(cer == 1) cout << rez;
    else if(cer == 2) cout << maxi;
    else cout << maxi1;
}
Comentarii

S-ar putea sa iti placa