Clasa a X-a · Subprograme (funcții)Read in English

Numere superprime în C++

În engleză: Super-prime numbers

Altă complexitateC++1758 de linii2 exemple

Ideea

Un număr este superprim dacă toate prefixele lui sunt numere prime. De exemplu 239 este superprim: 2, 23 și 239 sunt prime. Funcția estePrim(x) este refolosită de funcția superprim(x), care taie pe rând ultima cifră (x / 10) și verifică fiecare prefix. Se afișează toate numerele superprime mai mici sau egale cu n.

Descrierea în engleză

A number is super-prime if all its prefixes are prime. For example 239 is super-prime: 2, 23 and 239 are prime. The function estePrim(x) is reused by superprim(x), which cuts off the last digit one at a time (x / 10) and checks every prefix. All super-prime numbers less than or equal to n are printed.

Complexitate
O(n * k * sqrt(n)), unde k este numărul de cifre
Clasa
Clasa a X-a (Grade 10)

Exemple

Exemplul 1

Intrare

100

Ieșire așteptată

2 3 5 7 23 29 31 37 53 59 71 73 79
Exemplul 2

Intrare

10

Ieșire așteptată

2 3 5 7

Codul C++

Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.

numere-superprime.cpp
/*
 * Titlu: Numere superprime
 * Clasa: 10
 * Capitol: Subprograme (funcții)
 * Descriere: Un număr este superprim dacă toate prefixele lui sunt numere prime.
 *            De exemplu 239 este superprim: 2, 23 și 239 sunt prime. Funcția
 *            estePrim(x) este refolosită de funcția superprim(x), care taie pe rând
 *            ultima cifră (x / 10) și verifică fiecare prefix. Se afișează toate
 *            numerele superprime mai mici sau egale cu n.
 * Complexitate: O(n * k * sqrt(n)), unde k este numărul de cifre
 *
 * Exemplu
 * Intrare: 100
 * Ieșire: 2 3 5 7 23 29 31 37 53 59 71 73 79
 *
 * Exemplu
 * Intrare: 10
 * Ieșire: 2 3 5 7
 */
#include <iostream>
using namespace std;

bool estePrim(int x)
{
    if (x < 2)
        return false;
    for (int d = 2; d * d <= x; d++)
    {
        if (x % d == 0)
            return false;
    }
    return true;
}

bool superprim(int x)
{
    while (x > 0)
    {
        if (!estePrim(x))
            return false;
        x = x / 10;   // trecem la prefixul mai scurt
    }
    return true;
}

int main()
{
    int n;
    cin >> n;
    for (int x = 2; x <= n; x++)
    {
        if (superprim(x))
            cout << x << ' ';
    }
    cout << '\n';
    return 0;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.