สมมติว่าเรามีจำนวนเต็ม N ที่กำหนด; เราต้องหาผลรวมของจำนวนเฉพาะที่ตัดทอนได้ทั้งหมดที่น้อยกว่า N ดังที่เราทราบดีว่าจำนวนเฉพาะที่ตัดทอนได้นั้นเป็นตัวเลขที่เป็นจำนวนเฉพาะที่ตัดทอนได้ทางซ้าย (หากหลัก "ซ้าย" นำหน้าถูกลบออกอย่างต่อเนื่อง ตัวเลขที่ได้ทั้งหมดจะถือเป็นจำนวนเฉพาะ) เช่นเดียวกับจำนวนเฉพาะที่ตัดทอนได้ทางขวา (หากหลัก "ขวา" สุดท้ายถูกลบออกตามลำดับ ตัวเลขที่ได้ทั้งหมดจะถือเป็นจำนวนเฉพาะ) ตัวอย่างของจำนวนเฉพาะที่ตัดทอนได้คือ 9137 เนื่องจากเป็นจำนวนเฉพาะที่ตัดทอนได้เนื่องจาก 9137, 137, 37 และ 7 เป็นจำนวนเฉพาะ ดังนั้น 9137 จึงเป็นจำนวนเฉพาะที่ตัดทอนได้
ดังนั้น หากอินพุตเป็น N =55 เอาต์พุตจะเป็น 130 เป็น (2 + 3 + 5 + 7 + 23 + 37 + 53) =
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ไม่มี :=1000005
-
prime :=รายการ size N และเติม True
-
กำหนดฟังก์ชัน sieve() นี่จะใช้เวลา
-
ไพรม์[1] :=เท็จ ไพรม์[0] :=เท็จ
-
สำหรับผมอยู่ในช่วง 2 ถึง N ทำ
-
ถ้าไพรม์[i] เหมือนกับ True แล้ว
-
สำหรับ j ในช่วง i * 2 ถึง N ให้อัปเดตในแต่ละขั้นตอนโดย i ทำ
-
สำคัญ[j] :=เท็จ
-
-
-
-
จากวิธีหลัก ให้ทำดังนี้ −
-
ผลรวม :=0
-
สำหรับผมอยู่ในช่วง 2 ถึง n ทำ
-
ปัจจุบัน :=ผม
-
f :=จริง
-
-
ในขณะที่กระแสไม่เป็นศูนย์ให้ทำ
-
ถ้าไพรม์[กระแส] เป็นเท็จ แล้ว
-
f :=ผิด
-
ออกจากวง
-
-
ปัจจุบัน :=ปัจจุบัน / 10
-
-
ปัจจุบัน :=ผม
-
พลัง :=10
-
ในขณะที่ผลหารของ (กระแส / กำลัง) ไม่ใช่ศูนย์ให้ทำ
-
ถ้าไพรม์[กำลัง mod ปัจจุบัน] เป็นเท็จ แล้ว
-
f :=ผิด
-
ออกจากวง
-
-
พลัง :=พลัง * 10
-
-
ถ้า f เป็น True แล้ว
-
sum :=sum + i
-
-
ผลตอบแทนรวม
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
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))
อินพุต
55
ผลลัพธ์
130