Tôi đã tìm thấy một thủ thuật tuyệt vời để tìm thừa số chỉ bằng một nửa số phép nhân thực tế.
Hãy kiên nhẫn vì đây là một bài viết hơi dài.
Đối với số chẵn:
Để giảm một nửa phép nhân với số chẵn, bạn sẽ có n / 2 thừa số. Thừa số đầu tiên sẽ là số bạn đang lấy giai thừa, sau đó thừa số tiếp theo sẽ là số đó cộng với số đó trừ đi hai. Số tiếp theo sẽ là số trước đó cộng với số được cộng cuối cùng trừ đi hai. Bạn đã hoàn tất khi số cuối cùng bạn thêm vào là hai (tức là 2) . Điều đó có lẽ không có nhiều ý nghĩa, vì vậy hãy để tôi cho bạn một ví dụ.
8! = 8 * (8 + 6 = 14) * (14 + 4 = 18) * (18 + 2 = 20)
8! = 8 * 14 * 18 * 20 which is **40320**
Lưu ý rằng tôi bắt đầu với 8, sau đó số đầu tiên tôi thêm vào là 6, sau đó 4, sau đó là 2, mỗi số thêm vào là hai ít hơn sau đó số thêm vào trước nó. Phương pháp này tương đương với việc nhân số ít nhất với số lớn nhất, chỉ với phép nhân ít hơn, như sau:
8! = 1 * 2 * 3 * 4 * 5 * 6 * 7 *
8! = (1 * 8) * (2 * 7) * (3 * 6) * (4 * 5)
8! = 8 * 14 * 18 * 20
Đơn giản phải không :)
Now For Odd Numbers: Nếu là số lẻ, phép cộng cũng giống như khi bạn trừ hai lần mỗi lần, nhưng bạn dừng lại ở ba. Tuy nhiên, số lượng các yếu tố thay đổi. Nếu bạn chia số cho hai, bạn sẽ có một số kết thúc bằng .5. Lý do là nếu chúng ta nhân các đầu với nhau, chúng ta sẽ còn lại với số ở giữa. Về cơ bản, điều này đều có thể được giải quyết bằng cách giải cho một số thừa số bằng số bị chia cho hai, làm tròn. Điều này có lẽ cũng không có ý nghĩa gì đối với những người không có nền tảng toán học, vì vậy hãy để tôi làm một ví dụ:
9! = 9 * (9 + 7 = 16) * (16 + 5 = 21) * (21 + 3 = 24) * (roundUp(9/2) = 5)
9! = 9 * 16 * 21 * 24 * 5 = **362880**
Lưu ý: Nếu bạn không thích phương pháp này, bạn cũng có thể lấy giai thừa của số chẵn trước số lẻ (trong trường hợp này là tám) và nhân nó với số lẻ (tức là 9! = 8! * 9).
Bây giờ hãy triển khai nó trong 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;
}
isFirstlà một biến boolean được khai báo là static; nó được sử dụng cho trường hợp đầu tiên mà chúng ta không muốn thay đổi tổng trước đó.
Thử với số chẵn cũng như số lẻ.