เราได้รับจำนวนเต็มบวก n เป็นอินพุต เป้าหมายคือหาจำนวนคู่ที่เป็นไปได้ (i, j) ที่ผลรวม (i+j) เป็นจำนวนเฉพาะและน้อยกว่า n โดยที่ i != j และ i, j >= 1 หาก n เป็น 4 จะมีเพียง 1 คู่คือ (1,2) เพราะ 1+2 = 3 เป็นจำนวนเฉพาะและน้อยกว่า 4
มาดูตัวอย่าง
อินพุต − 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 จำนวนคู่ที่ต่างกันซึ่งมีผลรวมเป็น temp จะเท่ากับ temp/2
ยกเว้น 2 จำนวนเฉพาะทั้งหมดเป็นจำนวนคี่ ดังนั้นหากเราพบจำนวนเฉพาะน้อยกว่า n เราจะบวก temp/2 เข้ากับจำนวนคู่
- รับตัวแปร
nเป็นอินพุต - ฟังก์ชัน
prime_pair(int n)รับnและคืนจำนวนคู่ที่ผลรวมเป็นจำนวนเฉพาะและน้อยกว่าn - กำหนด
countเริ่มต้นเป็น 0 - เนื่องจาก Sieve of Sundaram สร้างจำนวนเฉพาะน้อยกว่า
2*n+2สำหรับอินพุตnเราลดnเหลือครึ่งหนึ่งเก็บในtemp_2 - สร้างอาเรย์
Check[]ความยาวtemp_2เพื่อทำเครื่องหมายตัวเลขรูปแบบ(i+j+2*i*j)เป็นจริง เริ่มต้นทั้งหมดเป็นเท็จ - ใช้ฟังก์ชัน
check_prime(bool check[], int temp)ทำเครื่องหมายcheck[]เป็นจริงสำหรับตัวเลขรูปแบบ(i+j+2*i*j)และผลรวม< temp - เดินทางผ่าน
Check[]ด้วยลูปforจากดัชนีi=0ถึงi<temp_2 - สำหรับแต่ละ
check[i]ที่เป็นเท็จ จำนวนเฉพาะจะเป็นtemp=2*i+1 - คู่ที่รวมกันได้
tempจะเป็นtemp/2 - บวก
temp/2เข้าcount - ในท้ายที่สุดของลูป เราจะได้จำนวนคู่ทั้งหมดที่ผลรวมเป็นจำนวนเฉพาะและน้อยกว่า
n - คืนค่า
countเป็นผลลัพธ์
ตัวอย่างโค้ด C++
#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