Rezolvare completă PbInfo #2351 numere23

Se numește număr 3-prim, un număr natural care se poate descompune în produs de cel mult 3 numere prime, nu neapărat distincte. Cunoscând numerele naturale n și k, construiți un șir format din primele n numere 3-prime. Ordinea numerelor în șir va fi stabilită astfel încât, extrăgând pe rând numerele din șir, începând cu primul număr și apoi câte un număr din k în k poziții, circular, să obținem în ordine crescătoare, șirul primelor n numere 3-prime. Parcurgerea circulară înseamnă că după elementul aflat în vector pe locul n, urmează elementul de pe locul 1.

Cerința

Cunoscând numerele n, k și c (c = 1 sau c = 2), se cere:
1. dacă c = 1, să se afișeze cel mai mare din cele n numere 3-prime.
2. dacă c = 2, să se construiască șirul de n numere care îndeplinește condiția din enunț.

Date de intrare

Fișierul de intrare numere23.in conţine pe prima linie, despărțite prin câte un spațiu, numerele naturale n, k și c, cu semnificaţia din enunţ.

Date de ieșire

Dacă c = 1, atunci pe prima linie a fişierului numere23.out va fi scris un singur număr ce reprezintă cel mai mare din cele n numere 3-prime. Dacă c = 2, atunci fişierul numere23.out va conţine despărțite prin câte un spațiu, șirul celor n numere 3-prime.

Restricții și precizări

  • 0 < k < n ≤ 10000
  • numerotarea elementelor în vector se face de la 1

Exemplul 1:

numere23.in

5  3  2

numere23.out

2 6 4 3 5

Explicație

Primele cinci numere 3-prime sunt: 2, 3, 4, 5, și 6. Șirul de numere 2, 6, 4, 3, 5 parcurs din 3 în 3, va forma în ordine crescătoare șirul de numere inițial.

Exemplul 2:

numere23.in

10 4  2

numere23.out

2 11 10 5 3 8 7 9 4 6

Explicație

Primele 10 numere 3-prime sunt: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Șirul de numere 2, 11, 10, 5, 3, 8, 7, 9, 4, 6, parcurs din 4 în 4, va forma în ordine crescătoare șirul de numere inițial.

Exemplul 3:

numere23.in

5  3  1

numere23.out

6

Explicație

Primele cinci numere 3-prime sunt: 2, 3, 4, 5, și 6. Cel mai mare număr din acest șir este 6.

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 numere23:

#include <fstream>
using namespace std;

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

long a[10001], b[10001], x, i, n, k;
int cer;

long urmatorul(long x);
int verif(long x);


int main()
{
    fin>>n>>k>>cer;
    x=2;
    for(i=1;i<=n;i++)
        {
        a[i]=x;
        x=urmatorul(x);
        }

    if(cer==1)                  ///cerinta 1
       fout<<a[n]<<'\n';
    else                        ///cerinta 2
    {                   ///plasez elem din a in b, parcurgand locurile libere din k in k
        b[1]=a[1];
        int p=1;

        for(i=2; i<=n; )
        {
            int m=0;  ///cate locuri libere am gasit
            if(p==n)
                p=1;
            else
                p++;

            while(m<k)      ///tb saparcurg pana la al k-lea loc liber
            {
                if(b[p]==0)
                   {
                       m++;
                       if(m==k)
                        {
                            b[p]=a[i++];m=0;
                            break;
                        }
                   }
                p++;
                if(p==n+1)
                    p=1;
            }

        }
        for(i=1;i<=n;i++)
            fout<<b[i]<<' ';
        fout<<'\n';
    }
    return 0;
}


int verif(long x)
{
    long nr=0,f=2;
    while(x%f==0)
    {
        x/=f;
        nr++;
        if(nr>3)
            return 0;
    }
    f=3;
    while(x>=f)
    {
         while(x%f==0)
         {
             x/=f;
             nr++;
         }
         if(nr>3) return 0;
         f+=2;
    }
    return nr<=3;
}
long urmatorul(long x)
{
    do
    {
        x++;
        if(verif(x))
            return x;
    }while(1);
}

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 #2351 numere23

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2351 numere23 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!