Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ค้นหาผลรวมของจำนวนเฉพาะที่ตัดทอนได้ด้านล่าง N ใน Python


สมมติว่าเรามีจำนวนเต็ม 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