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

C++ หาจำนวนศูนย์ต่อท้ายในฐาน 16 ของ N!


ในบทความนี้ เราจะเข้าใจปัญหาการหาจำนวนศูนย์ต่อท้ายของจำนวน N ในการแทนค่าแฟกทอเรียล (N!) ในฐาน 16 เช่น

Input : N = 7 Output : 1 Explanation : fact(7) = 5040 ในฐาน 10 และ 13B0 ในฐาน 16 มี 1 ศูนย์ต่อท้าย
Input : N = 11 Output : 2 Explanation : fact(11) = 39916800 ในฐาน 10 และ 2611500 ในฐาน 16 มี 2 ศูนย์ต่อท้าย

ทบทวนการแปลงเลขฐานสิบไปฐานอื่น เช่น แปลง (5040)10 เป็น (?)16

C++ หาจำนวนศูนย์ต่อท้ายในฐาน 16 ของ N!

คือการหารด้วย 16 และเก็บเศษจนกว่าจะหารไม่ลง ผลลัพธ์คือเศษเรียงจากหลังมาหน้า

ได้ 1 ศูนย์ต่อท้าย ซึ่งเกิดเมื่อ 16 หารจำนวนลงตัว

การแยกตัวประกอบเฉพาะของ 5040 = 16¹ × 451 × 7¹ หมายความว่า 16 หาร 5040 ลงตัว 1 ครั้ง เท่ากับจำนวนศูนย์ต่อท้าย

วิธีการแก้ปัญหา

เรารู้ว่า 16 = 2⁴ ดังนั้นกำลังสูงสุดของ 2 ใน N หาร 4 จะได้กำลังสูงสุดของ 16 ซึ่งเป็นสูตรของเลจองดร (Legendre's Formula)

โค้ด C++ สำหรับวิธีการข้างต้น

นี่คือโค้ด C++ ที่ใช้แก้ปัญหานี้

ตัวอย่าง

#include <bits/stdc++.h> 
using namespace std; 

int main () { 
    int n = 11; 
    long long int count = 0; 
    long long int value, power = 2; 
    long long int result; 
    do{ 
        value = n / power; 
        count += value; 
        power *= 2; 
    } while (value != 0); 
    // count เก็บกำลังสูงสุดของ 2 
    result = count / 4; 
    cout << "Number of trailing zeroes in base 16 representation of N : " << result; 
}

ผลลัพธ์

Number of trailing zeroes in base 16 representation of N: 2

คำอธิบายโค้ด

  • เริ่มต้น power = 2 เพราะต้องหากำลังสูงสุดของ 2
  • ใช้สูตรเลจองดรในลูป while: หาร n ด้วย power (เริ่มต้น 2) บวกเข้า count แล้วคูณ power ด้วย 2
  • หลังลูปจบ count จะมีกำลังสูงสุดของ 2 แล้วหาร 4 ได้คำตอบ
  • พิมพ์ผลลัพธ์

สรุป

ในบทความนี้ เราแก้ปัญหาการหาจำนวนศูนย์ต่อท้ายในฐาน 16 ของ N! โดยใช้สูตรของเลจองดร เรายังเขียนโค้ด C++ เพื่อแก้ปัญหานี้ สามารถนำไปใช้กับภาษาอื่น เช่น Java, C, Python ได้ หวังว่าจะเป็นประโยชน์