Informatică, întrebare adresată de SabiSimpson, 9 ani în urmă

Cerința
Marinel a învăţat la şcoală despre divizibilitatea numerelor naturale. Un număr natural nenul a este divizor al numărului natural nenul b dacă restul împărţirii lui b la a este 0. De exemplu, numărul 3 este divizor al lui 12 iar numărul 4 nu este divizor al lui 15. Un număr natural nenul n este număr prim dacă are doar 2 divizori: 1 şi n. De exemplu, numărul 7 este număr prim deoarece îi are ca divizori doar pe 1 şi 7 iar numărul 21 nu este număr prim deoarece îi are ca divizori pe 1, 3, 7 şi 21. Scrieţi un program care să îl ajute pe Marinel să îşi verifice tema primită pentru acasă.

Fiind date numărul n al numerelor din şir şi numerele din şir, să se determine:
1) divizorii celui mai mare număr din şir, inclusiv 1 şi el însuşi;
2) numerele prime din şir;
3) numerele care sunt divizori ai tuturor numerelor din şir.

Date de intrare
Fişierul de intrare divizori2.in conține pe prima linie un număr natural P, pe a doua linie un număr natural n reprezentând numărul de numere din şir şi pe a treia linie cele n numere naturale din şir, separate prin spaţii.

Date de ieșire
Dacă valoarea lui P este 1, se va rezolva numai punctul 1) din cerinţă: fişierul divizori2.out va conţine pe prima linie doar divizorii celui mai mare număr din şir.
Dacă valoarea lui P este 2, se va rezolva doar punctul 2) din cerinţă:
fişierul divizori2.out va conţine pe prima linie doar numerele prime din şir sau numărul -1 dacă şirul nu conţine numere prime.
Dacă valoarea lui P este 3, se va rezolva numai punctul 3) din cerinţă:
fişierul divizori2.out va conţine pe prima linie doar numerele care sunt divizori ai tuturor numerelor din şir.

Restricții și precizări
valoarea lui P poate să fie doar 1 sau 2 sau 3;
numărul natural n este cuprins între 2 şi 1000;
numerele din şir sunt numere naturale nenule cu cel mult 6 cifre;

Exemplu1:
divizori2.in
1
7
12 18 8 4 13 6 17

divizori2.out
1 2 3 6 9 18

Explicație
P=1 deci se rezolvă prima cerinţă.
Cel mai mare număr din şir este 18.
Divizorii numărului 18 sunt 1, 2, 3, 6, 9 şi 18.

Exemplu2:
divizori2.in
2
7
12 18 8 4 13 6 17

divizori2.out
13 17

Explicație
P=2 deci se rezolvă a doua cerinţă.
Numerele prime din şir sunt 13 şi 17.

Exemplu3:
divizori2.in
2
7
12 18 8 4 12 6 15

divizori2.out
-1

Explicație
P=2 deci se rezolvă a doua cerinţă.
Nu sunt numere prime în şir.

Exemplu4:
divizori2.in
3
4
70 42 21 35

divizori2.out
1 7

Explicație
P=3 deci se rezolvă a treia cerinţă.
Divizorii lui 70 sunt 1, 2, 5, 7, 10, 14, 35 şi 70.
Divizorii lui 42 sunt 1, 2, 3, 6, 7, 14, 21 şi 42.
Divizorii lui 21 sunt 1, 3, 7 şi 21.
Divizorii lui 35 sunt 1, 5, 7 şi 35.
Numerele care sunt divizori ai tuturor numerelor din şir sunt 1 şi 7.

Răspunsuri la întrebare

Răspuns de stassahul
10
#include <bits/stdc++.h>

using namespace std;

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

int P,n,a[1001];

int Prime(int a);

int main()
{

    fin >> P >> n;

    if(P==1)
    {
        int Max=-1;
        for(int i=1;i<=n;i++)
        {
            fin >> a[i];
            if(a[i]>Max) Max=a[i];
        }

        if(Prime(Max)) fout << 1 << " " << Max;
        else
        {
            for(int i=1;i<=Max;i++)
                if(Max%i==0) fout << i << " ";
        }
    }
    else if(P==2)
    {
        int k=0;
        for(int i=1;i<=n;i++)
        {
            fin >> a[i];
            if(Prime(a[i])) fout << a[i] << " ", k=1;
        }
        if(k==0) fout << -1;
    }
    else
    {
        int Min=1000000;
        for(int i=1;i<=n;i++)
        {
            fin >> a[i];
            if(a[i]<Min) Min=a[i];
        }
        for(int j=1;j<=Min;j++)
        {
            int k=0;
            for(int i=1;i<=n;i++)
                if(a[i]%j==0) k++;
            if(k==n) fout << j << " ";
        }
    }

    return 0;

}

int Prime(int a)
{
   int i;
   if (a == 2)
      return 1;
   if (a == 0 || a == 1 || a % 2 == 0)
      return 0;
   for(i = 3; i*i <= a && a % i; i += 2)
      ;
   return i*i > a;
}
Alte întrebări interesante