ฉันพบเคล็ดลับที่น่าทึ่งในการหาแฟกทอเรียลเพียงครึ่งเดียวของการคูณจริง
โปรดอดทนเนื่องจากนี่เป็นโพสต์ที่ยาวสักหน่อย
สำหรับเลขคู่:
หากต้องการลดการคูณด้วยเลขคู่ลงครึ่งหนึ่งคุณจะได้ปัจจัย n / 2 ตัวประกอบแรกคือจำนวนที่คุณกำลังหาแฟกทอเรียลจากนั้นตัวต่อไปจะเป็นจำนวนนั้นบวกกับจำนวนนั้นลบสอง หมายเลขถัดไปจะเป็นหมายเลขก่อนหน้าบวกกับหมายเลขที่เพิ่มล่าสุดลบสอง คุณจะทำเมื่อหมายเลขสุดท้ายที่คุณเพิ่มเป็นสอง (เช่น 2) นั่นอาจไม่สมเหตุสมผลมากนักขอฉันยกตัวอย่างให้คุณ
8! = 8 * (8 + 6 = 14) * (14 + 4 = 18) * (18 + 2 = 20)
8! = 8 * 14 * 18 * 20 which is **40320**
โปรดทราบว่าฉันเริ่มต้นด้วย 8 จากนั้นหมายเลขแรกที่ฉันเพิ่มคือ 6 จากนั้น 4 แล้ว 2 แต่ละหมายเลขที่เพิ่มเป็นสองน้อยกว่าจากนั้นจึงเพิ่มจำนวนก่อนหน้านั้น วิธีนี้เทียบเท่ากับการคูณจำนวนน้อยที่สุดด้วยจำนวนที่มากที่สุดเพียงแค่คูณน้อยลงดังนี้
8! = 1 * 2 * 3 * 4 * 5 * 6 * 7 *
8! = (1 * 8) * (2 * 7) * (3 * 6) * (4 * 5)
8! = 8 * 14 * 18 * 20
เรียบง่ายใช่ไหม :)
ตอนนี้สำหรับเลขคี่:หากจำนวนเป็นเลขคี่การเพิ่มจะเหมือนกันเช่นเดียวกับที่คุณลบสองครั้งในแต่ละครั้ง แต่คุณหยุดที่สาม จำนวนของปัจจัยเปลี่ยนแปลงอย่างไรก็ตาม หากคุณหารจำนวนด้วยสองคุณจะได้ตัวเลขที่ลงท้ายด้วย. 5 เหตุผลก็คือถ้าเราคูณปลายเข้าด้วยกันเราจะเหลือเลขกลาง โดยพื้นฐานแล้วสิ่งนี้สามารถแก้ไขได้โดยการแก้ปัจจัยหลายอย่างเท่ากับจำนวนที่หารด้วยสองแล้วปัดขึ้น สิ่งนี้อาจไม่สมเหตุสมผลนักหากไม่มีพื้นฐานทางคณิตศาสตร์ดังนั้นให้ฉันทำตัวอย่าง:
9! = 9 * (9 + 7 = 16) * (16 + 5 = 21) * (21 + 3 = 24) * (roundUp(9/2) = 5)
9! = 9 * 16 * 21 * 24 * 5 = **362880**
หมายเหตุ:หากคุณไม่ชอบวิธีนี้คุณสามารถนำแฟกทอเรียลของจำนวนคู่ก่อนเลขคี่ (แปดในกรณีนี้) แล้วคูณด้วยจำนวนคี่ (เช่น 9! = 8! * 9)
ตอนนี้มาใช้งานใน Java:
public static int getFactorial(int num)
{
int factorial=1;
int diffrennceFromActualNum=0;
int previousSum=num;
if(num==0) //Returning 1 as factorial if number is 0
return 1;
if(num%2==0)// Checking if Number is odd or even
{
while(num-diffrennceFromActualNum>=2)
{
if(!isFirst)
{
previousSum=previousSum+(num-diffrennceFromActualNum);
}
isFirst=false;
factorial*=previousSum;
diffrennceFromActualNum+=2;
}
}
else // In Odd Case (Number * getFactorial(Number-1))
{
factorial=num*getFactorial(num-1);
}
return factorial;
}
isFirstเป็นตัวแปรบูลีนที่ประกาศเป็นแบบคงที่ ใช้สำหรับกรณีแรกที่เราไม่ต้องการเปลี่ยนผลรวมก่อนหน้านี้
ลองใช้เลขคู่และเลขคี่