1145 - Extraprime
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")