ดังที่เราทราบแล้วว่า log(x*y) =log(x) + log(y) ดังนั้นเราจะมาดูกันว่าจำนวนขั้นต่ำของค่าบันทึกที่จำเป็นในการคำนวณค่าบันทึกทั้งหมดตั้งแต่ 1 ถึง N ดังนั้นถ้า N คือ 6 ผลลัพธ์จะเป็น 3 ตั้งแต่ log(1) ถึง log(6) จะมี ต้องระบุค่าบันทึกสามค่า ยกเว้นบันทึก (1) เนื่องจาก log(1) มีค่าเป็น 0 เสมอ ดังนั้นให้ข้ามไป ตอนนี้สำหรับ log(2) และ log(3) เราต้องหา หลังจากนั้นสำหรับ log(4) นี่คือ log(2)+ log(2) แต่ค่าของ log(2) เป็นที่ทราบกันดีอยู่แล้ว ดังนั้นเราจึงไม่คำนวณสิ่งนี้อีก สำหรับ log(5) เราจำเป็นต้องคำนวณ ตอนนี้นับคือ 3 log(6) =log(3) + log(2) ทราบแล้ว ดังนั้นการนับจึงเป็น 3
ปัญหานี้สามารถลดลงได้เพื่อค้นหาจำนวนเฉพาะในช่วง 1 ถึง N ดังที่เราจะเห็นได้ว่าสำหรับจำนวนเฉพาะ เราต้องคำนวณค่าบันทึกอย่างอิสระ มิฉะนั้นเราต้องแยกตัวประกอบและคำนวณ
ตัวอย่าง
#include<iostream> #include<vector> #define MAX 1000005 using namespace std; vector<int> prime(MAX, 1); void seive(int N) { prime[0] = prime[1] = 0; for (int i = 2; i <= N; i++) { if (prime[i] == 1) { for (int j = 2; i * j <= N; j++) prime[i * j] = 0; } } } int numberOfLogs(int N) { int log_count = 0; seive(N); for (int i = 1; i <= N; i++) { if (prime[i] == 1) log_count++; } return log_count; } int main() { int N = 8; cout<<"Minimum number of log counts required: " << numberOfLogs(N)<<endl; }
ผลลัพธ์
Minimum number of log counts required: 4