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
1nu 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
<syntaxhighlight lang="python3" line="1"> 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")
</syntaxhighlight>