ภารกิจคือการค้นหาจำนวนสูงสุดของปัจจัยเฉพาะเฉพาะที่ตัวเลขสามารถมีได้ในช่วง [1, N] โดยที่ N จะได้รับ
ตอนนี้มาทำความเข้าใจสิ่งที่เราต้องทำโดยใช้ตัวอย่าง -
ป้อนข้อมูล − N=100
ผลลัพธ์ − 3
คำอธิบาย − ให้เราหา 30 ในช่วง [1, 100]
30 =3 * 2 * 5 =ปัจจัยเฉพาะเฉพาะ ดังนั้น ในช่วง [1, 100] จะพบปัจจัยเฉพาะสูงสุด 3 ตัว
ป้อนข้อมูล − N=300
ผลผลิต − 4
แนวทางที่ใช้ในโปรแกรมด้านล่างดังนี้
-
ในฟังก์ชัน MaxPrime() เราจะตรวจสอบก่อนว่า (N <2) ถ้าใช่ก็แค่คืนค่าศูนย์ มิฉะนั้น ให้ดำเนินการต่อ
-
จากนั้นเราจะใช้ตะแกรง Eratosthenes เพื่อหาจำนวนเฉพาะทั้งหมดก่อนจำนวนที่กำหนด N
-
เริ่มต้นสองตัวแปร pro=1 และ max=0 ของประเภท int เพื่อจัดเก็บผลิตภัณฑ์และคำตอบสุดท้ายตามลำดับ
-
ภายในตะแกรงของ Eratosthenes เราจะคูณจำนวนเฉพาะชุดแรกจนกว่าผลคูณจะยังคงน้อยกว่า N โดยการเขียน − pro=*p;
-
ตรวจสอบว่า (pro> N) ถ้าใช่ ให้คืนค่า max และเพิ่ม 1 เป็น max.
-
นอกตะแกรง ให้คืนสูงสุดด้วย
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int MaxPrime(int N){ if (N < 2) return 0; // Using Sieve of Eratosthenes bool Arr[N+1]; memset(Arr, true, sizeof(Arr)); int pro = 1, max = 0; for (int p=2; p*p<=N; p++){ if (Arr[p] == true){ for (int i=p*2; i<=N; i += p) Arr[i] = false; /*Multiply first set of prime numbers while product remains smaller than N*/ pro *= p; if (pro > N) return max; max++; } } return max; } //Main function int main(){ int N = 300; cout << MaxPrime(N); return 0; }
ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น เราจะได้ผลลัพธ์ดังต่อไปนี้ -
4