Giả sử chúng ta có một số nguyên N cho trước; chúng ta phải tìm tổng của tất cả các số nguyên tố có thể rút gọn nhỏ hơn N. Như chúng ta biết số nguyên tố có thể cắt ngắn là một số là số nguyên tố có thể cắt bỏ bên trái (nếu chữ số đứng đầu "bên trái" bị loại bỏ liên tiếp, thì tất cả các số kết quả được coi là số nguyên tố) cũng như số nguyên tố có thể cắt ngắn bên phải (nếu chữ số "bên phải" cuối cùng bị xóa liên tiếp, thì tất cả các số kết quả được coi là số nguyên tố). Một ví dụ về số nguyên tố có thể cắt ngắn là 9137 vì đây là số nguyên tố có thể cắt rời vì 9137, 137, 37 và 7 là các số nguyên tố. Do đó, 9137 là một số nguyên tố có thể cắt ngắn.
Vì vậy, nếu đầu vào là N =55, thì đầu ra sẽ là 130 là (2 + 3 + 5 + 7 + 23 + 37 + 53) =
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
N:=1000005
-
prime:=một danh sách có kích thước N và điền bằng True
-
Xác định một hàm sàng (). Điều này sẽ mất
-
số nguyên tố [1]:=Sai, số nguyên tố [0]:=Sai
-
đối với tôi trong phạm vi từ 2 đến N, hãy thực hiện
-
nếu số nguyên tố [i] giống với True, thì
-
cho j trong phạm vi i * 2 đến N, cập nhật từng bước theo i, thực hiện
-
prime [j]:=False
-
-
-
-
Từ phương thức chính, thực hiện như sau -
-
tổng:=0
-
đối với tôi trong phạm vi từ 2 đến n, hãy làm
-
hiện tại:=i
-
f:=Đúng
-
-
trong khi hiện tại là khác 0, thực hiện
-
nếu số nguyên tố [hiện tại] là Sai, thì
-
f:=Sai
-
đi ra từ vòng lặp
-
-
current:=current / 10
-
-
hiện tại:=i
-
quyền lực:=10
-
trong khi thương số của (hiện tại / công suất) là khác 0, thực hiện
-
nếu nguyên tố [công suất mod hiện tại] là Sai, thì
-
f:=Sai
-
đi ra từ vòng lặp
-
-
power:=power * 10
-
-
nếu f là True thì
-
sum:=sum + i
-
-
trả lại số tiền
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
N = 1000005 prime = [True for i in range(N)] def sieve(): prime[1] = False prime[0] = False for i in range(2, N): if (prime[i]==True): for j in range(i * 2, N, i): prime[j] = False def get_total_of_trunc_primes(n): sum = 0 for i in range(2, n): current = i f = True while (current): if (prime[current] == False): f = False break current //= 10 current = i power = 10 while (current // power): if (prime[current % power] == False): f = False break power *= 10 if f: sum += i return sum n = 55 sieve() print(get_total_of_trunc_primes(n))
Đầu vào
55
Đầu ra
130