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

นับคู่ที่มีผลรวมเป็นจำนวนเฉพาะและน้อยกว่า n ใน C++


เราได้รับจำนวนบวก n เป็นอินพุต เป้าหมายคือการหาจำนวนคู่ที่เป็นไปได้ (i,j) โดยที่แต่ละคู่มีผลรวม (i+j) ซึ่งเป็นจำนวนเฉพาะและน้อยกว่า n นอกจากนี้ i !=j และ i,j>=1 ถ้า n เป็น 4 ดังนั้นจะมีเพียง 1 คู่เท่านั้น ซึ่งก็คือ (1,2) ที่นี่ 1+2 =3 เป็นจำนวนเฉพาะและน้อยกว่า 4 และ 1,2>=1 ด้วย

ให้เราเข้าใจด้วยตัวอย่าง

ป้อนข้อมูล − n=7

ผลผลิต − นับคู่ที่มีผลรวมเป็นจำนวนเฉพาะและน้อยกว่า n คือ − 3

คำอธิบาย − คู่จะเป็น (1,2), (1,4), (2,3) ผลรวม 3, 5, 5 เป็นจำนวนเฉพาะและน้อยกว่า 7

ป้อนข้อมูล − n=10

ผลผลิต − นับคู่ที่มีผลรวมเป็นจำนวนเฉพาะและน้อยกว่า n คือ − 6

คำอธิบาย

คู่จะเป็น (1,2) (1,4) (2,3) (1,6) (2,5), (3,4)

ผลรวมที่ 3, 5, 5, 7, 7, 7 เป็นจำนวนเฉพาะและน้อยกว่า 10

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้

ในวิธีนี้ เราจะค้นหาจำนวนเฉพาะทั้งหมดที่น้อยกว่า n โดยใช้ Sieve of Sundaram ในฟังก์ชัน check_prime(bool check[], int temp)

นอกจากนี้ สำหรับแต่ละอุณหภูมิเลขคี่ การนับของคู่ที่แตกต่างกันซึ่งมีอุณหภูมิรวมจะเป็น temp/2

ยกเว้น 2 จำนวนเฉพาะทั้งหมดเป็นเลขคี่ ดังนั้นหากเราพบจำนวนเฉพาะใดๆ ที่น้อยกว่า n เราจะบวก temp/2 เพื่อนับจำนวนคู่

  • รับตัวแปร n เป็นอินพุต

  • ฟังก์ชัน prime_pair(int n) รับ n และส่งกลับจำนวนคู่ที่มีผลรวมเป็นจำนวนเฉพาะและน้อยกว่า n

  • นับเริ่มต้นเป็น 0

  • เนื่องจาก Sieve of Sundaram สร้างจำนวนเฉพาะน้อยกว่า 2*n+2 สำหรับอินพุต n เราลด n ลงครึ่งหนึ่งแล้วเก็บใน temp_2

  • สร้างอาร์เรย์ Check[] ของความยาว temp_2 เพื่อทำเครื่องหมายตัวเลขทั้งหมดของแบบฟอร์ม ( i+j+2*i*j ) เป็น True เริ่มต้นด้วยองค์ประกอบทั้งหมดเป็นเท็จ

  • ใช้ฟังก์ชัน check_prime(bool check[], int temp) เริ่มต้น check[] ด้วยค่าจริงสำหรับตัวเลขของแบบฟอร์ม (i+j+2*i*j) และผลรวมนี้ <ชั่วคราว

  • ตอนนี้สำรวจ [] โดยใช้ for loop จากดัชนี i=0 ถึง i

  • สำหรับแต่ละเช็ค[i] เป็นเท็จ หมายเลขเฉพาะจะเป็น temp=2*i+1

  • คู่ที่รวมกันเป็น temp จะเป็น temp/2

  • เพิ่ม temp/2 เพื่อนับ

  • ในตอนท้ายของ for loop เราจะมีคู่ทั้งหมดที่มีผลรวมเป็นจำนวนเฉพาะและน้อยกว่า n

  • ผลตอบแทนนับเป็นผลลัพธ์

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
void check_prime(bool check[], int temp){
   for (int i=1; i<=temp; i++){
      for (int j=i; (i + j + 2*i*j) <= temp; j++){
         check[i + j + 2*i*j] = true;
      }
   }
}
int prime_pair(int n){
   int count = 0;
   int temp;
   int temp_2 = (n-2)/2;
   bool check[temp_2 + 1];
   memset(check, false, sizeof(check));
   check_prime(check, temp_2);
   for (int i=1; i <= temp_2; i++){
      if (check[i] == false){
         temp = 2*i + 1;
         count += (temp / 2);
      }
   }
   return count;
}
int main(){
   int n = 10;
   cout<<"Count of pairs with sum as a prime number and less than n are: " <<prime_pair(n);
   return 0;
}

ผลลัพธ์

หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -

Count of pairs with sum as a prime number and less than n are: 6