1145 - Extraprime

De la Universitas MediaWiki

Gigel, mare amator de probleme de matematică şi informatică, a observat că unele numere prime au o proprietate interesantă: orice cifră ar elimina dintr-un astfel de număr, numărul obţinut este tot număr prim. A numit astfel de numere numere extraprime. De exemplu, numărul 317 este un număr extraprim: el este număr prim şi, în plus, dacă eliminăm cifra 3, obţinem 17, care este prim; dacă eliminăm 1, obţinem 37, care este prim; dacă eliminăm 7, obţinem 31, care este şi el număr prim.

Cerință

Spunem că x este între a şi b dacă x≥a şi x≤b. Fiind date două valori naturale a şi b, să se determine câte numere extraprime există între a şi b, precum şi cel mai mic şi cel mai mare număr extraprim dintre a şi b.

Date de intrare

Fișierul de intrare input.txt conține pe prima linie cele două valori naturale a şi b, separate printr-un spaţiu.

Date de ieșire

Fișierul de ieșire output.txt va conține 3 linii. Pe prima linie se va scrie un număr natural nr reprezentând numărul de numere extraprime dintre a şi b. Pe linia a doua a fişierului de ieşire se va scrie cel mai mic număr extraprim dintre a şi b, iar pe linia a treia a fişierului de ieşire se va scrie cel mai mare număr extraprim dintre a şi b.

Restricții și precizări

  • 10 < a ≤ b < 10000000;
  • Numărul 1 nu este prim;
  • Pentru datele de test există întotdeauna soluţie;

Exemplul 1

input.txt:

10 100

output.txt:

4

23

73

Explicație:

Se află 4 numere extraprime mai mari decât 10 şi mai mici decât 100: 23, 37, 53 şi 73.

Exemplul 2

input.txt:

99999999999999999999 1

Output:

Input-ul nu convine conditiilor

Rezolvare

from math import log10

def verificare(a, b):
    if not(10<=a<=10000000):
        print("Input-ul nu convine conditiilor")
        exit()
    if not(10<=b<=10000000):
        print("Input-ul nu convine conditiilor")
        exit()

N = 10000000
e = [0] * (N + 1)
fr = [0] * (N + 1)
a, b, t, maxi, mini = 0, 0, 0, -1, N

def ciur():
    e[0] = e[1] = 1

    for i in range(2, N + 1):
        if not e[i]:
            for j in range(i * 2, N + 1, i):
                e[j] = 1

def eliminare(x):
    pow10, get, k = 1, 0, 0

    if e[x]:
        return 0

    while pow10 <= x:
        get = x % pow10
        k = x // pow10 // 10
        k = k * pow10 + get

        if e[k]:
            return 0

        pow10 *= 10

    return 1

ciur()

# Reading input from a file
with open("input.txt", "r") as infile:
    a, b = map(int, infile.readline().split())
    verificare(a,b)

# Writing output to a file
with open("output.txt", "w") as outfile:
    for i in range(a, b + 1):
        r = eliminare(i)
        t += r

        if r == 1:
            maxi = max(maxi, i)
            mini = min(mini, i)

    outfile.write(f"{t}\n{mini}\n{maxi}\n")