เราได้รับค่าจำนวนเต็มและภารกิจคือการคำนวณแฟกทอเรียลของตัวเลขก่อนแล้วจึงคำนวณจำนวนหลักในผลลัพธ์
จำนวนแฟกทอเรียลคืออะไร
แฟกทอเรียลของตัวเลขคำนวณโดยการคูณตัวเลขในตัวเลขโดยลดค่าของหลักลง 1 ซึ่งแสดงด้วยสัญลักษณ์ '!' เช่น 0!, 1!, 2!, 3!, 5!,... . ฯลฯ แฟกทอเรียลของ 0! และ 1! เป็น 1. เสมอ
I.e. factorial of 2 = 2 * (2-1) = 2 * 1 = 2 factorial of 3 = 3 * (3-1) * (2-1) = 3 * 2 * 1 = 6
ตัวอย่าง
Input − factorial(6) Output − number of digits in factorial(6) is: 3
คำอธิบาย − เนื่องจากค่าแฟกทอเรียลของ 6 คือ 720 และมี 3 หลัก ดังนั้นผลลัพธ์จึงเป็น 3
Input − factorial(12) Output− number of digits in factorial(12) is: 9
คำอธิบาย − เนื่องจากค่าแฟกทอเรียลของ 12 คือ 479001600 และมีตัวเลข 9 หลัก ผลลัพธ์จึงเป็น 9
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
-
ป้อนจำนวนที่ต้องการคำนวณแฟกทอเรียล
-
หากตัวเลขน้อยกว่า 0 ให้คืนค่า 0 เนื่องจากตัวเลขติดลบไม่มีค่าใด ๆ ของแฟคทอเรียล
-
หากตัวเลขคือ 1 ให้ส่งคืน 1 เพราะ 1! เป็น 1 และมี 1 หลัก
-
หากตัวเลขมากกว่า 1 คือ เริ่มต้นด้วย 2 หรือมากกว่า ให้สร้างหนึ่งวง เริ่มตั้งแต่ 2 จนถึงน้อยกว่าหรือเท่ากับตัวเลข
-
ใช้ตัวแปรชั่วคราวตัวหนึ่ง สมมุติว่า d และเริ่มต้นมันด้วย 0 นอกลูป และในลูปให้เพิ่มมันเข้าไปด้วยค่าของ log10(i) จนกระทั่งทุกๆ การวนซ้ำของ i
-
หลังจากนั้น คืนค่าพื้นของ 'floor(d)+1'
-
พิมพ์ผลลัพธ์
ตัวอย่าง
#include <iostream> #include <cmath> using namespace std; // This function returns the number of digits present in num! int count_digits(int num){ // factorial exists only if num <= 0 if (num < 0){ return 0; } // base case if (num <= 1){ return 1; } // else iterate through num and calculate the // value double d = 0; for (int i=2; i<=num; i++){ d += log10(i); } return floor(d) + 1; } int main(){ cout<<"number of digits in factorial(1) is: "<<count_digits(1)<< endl; cout<<"number of digits in factorial(6) is: "<<count_digits(6) << endl; cout<<"number of digits in factorial(106) is: "<<count_digits(106) << endl; return 0; }
ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
number of digits in factorial(1) is: 1 number of digits in factorial(6) is: 3 number of digits in factorial(106) is: 171