ในบทความนี้ เราจะเข้าใจปัญหาในการค้นหาเลขศูนย์ต่อท้ายของจำนวนที่กำหนด N ในการแทนค่าแฟกทอเรียลในฐาน B สำหรับตัวอย่าง
Input : N = 7 Base = 2 Output : 4 Explanation : fact(7) = 5040 in base10 and 1001110110000 in base16 having 4 trailing zero. Input : N = 11 Base = 5 Output : 2 Explanation : fact(11) = 39916800 in base10 and 40204314200 in base16 having 2 trailing zeroes.
เรามาสรุปขั้นตอนการแปลงเลขฐานสิบจากฐานหนึ่งเป็นฐานอื่นกันก่อน ลองมาดูตัวอย่างการแปลง (5040)10 เป็น (?)2

คือ หารเลขด้วย 2 แล้วเหลือเศษไว้จนหารเลขไม่ได้อีก ผลลัพธ์จะเป็นส่วนที่เหลือในลำดับที่กลับกัน
ด้วยเหตุนี้ เรามีศูนย์ต่อท้าย 4 ตัว และศูนย์ต่อท้ายนี้เราได้เมื่อ 2 หารตัวเลขด้วยเศษ 0
การแยกตัวประกอบเฉพาะของ 5040 =24 * 56711 * 3381 * 181 หมายความว่า 2 หาร 5040 4 ครั้งด้วยเศษ 0 ซึ่งเท่ากับศูนย์ตามหลัง ด้วยวิธีนี้ เราสามารถคำนวณจำนวนศูนย์ต่อท้ายได้
แนวทางในการหาทางออก
เราได้กล่าวถึงวิธีการหาจำนวนศูนย์ต่อท้าย เราต้องหากำลังสูงสุดของ B ในแฟกทอเรียล N สมมติว่าฐาน B =14 จากนั้น 14 ในฐาน 14 จะแสดงเป็น 10 นั่นคือ (14)10 =(10)14 เป็นที่รู้จักกันว่าสูตรของ Legendre
โค้ด C++ สำหรับแนวทางด้านบน
นี่คือไวยากรณ์ C++ ที่เราสามารถใช้เป็นอินพุตเพื่อแก้ปัญหาที่กำหนดได้ -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
vector < pair < int, int >> primeFactorsofBase(int Base) {
// declaring factors to store prime factors
// along with occurence in factorisation of Base .
vector < pair < int, int >>factors;
for (int i = 2; Base != 1; i++) {
if (Base % i == 0) {
int count = 0;
while (Base % i == 0){
Base = Base / i;
count++;
}
factors.push_back (make_pair (i, count));
}
}
return factors;
}
int main () {
int N = 11, Base = 5;
// finding the largest power of Base that divides factorial N.
vector < pair < int, int >>prime_factors;
// finding prime factors by primeFactorsofBase() function.
prime_factors = primeFactorsofBase(Base);
int result = INT_MAX;
for (int i = 0; i < prime_factors.size (); i++) {
// calculating minimum power.
int count = 0;
int r = prime_factors[i].first;
while (r <= N){
count += (N / r);
r = r * prime_factors[i].first;
}
result = min (result, count / prime_factors[i].second);
}
//printing trailing zeroes stored in result.
cout << "Number of trailing zeroes: " <<result;
return 0;
} ผลลัพธ์
Number of trailing zeroes: 2
คำอธิบายของโค้ดด้านบน
- ค้นหาพลังที่ใหญ่ที่สุดของฐานโดยใช้เวกเตอร์
- ในการคำนวณกำลังสูงสุด ให้คำนวณตัวประกอบเฉพาะโดยใช้เวกเตอร์เพื่อเก็บตัวประกอบเฉพาะทั้งหมด
- จากนั้นคำนวณกำลังขั้นต่ำของปัจจัยเฉพาะทั้งหมดของเบส
- สุดท้าย กำลังพิมพ์ผลลัพธ์
บทสรุป
ในบทความนี้ เราแก้ปัญหาการหาจำนวนศูนย์ต่อท้ายในการแทนค่าฐาน B ของแฟกทอเรียล N ซึ่งเราแก้โดยใช้สูตรของ Legendre เรายังเขียนโค้ด C++ เพื่อแก้ปัญหาเดียวกัน คุณสามารถเขียนโค้ดนี้ในภาษาอื่นๆ เช่น Java, C, python เป็นต้น เราหวังว่าคุณจะพบว่าบทความนี้มีประโยชน์