題目

Normally, the factorial of a positive integer n is the product of all positive integers less than or equal to n.  For example, factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1.

We instead make a clumsy factorial: using the integers in decreasing order, we swap out the multiply operations for a fixed rotation of operations: multiply (*), divide (/), add (+) and subtract (-) in this order.

For example, clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1.  However, these operations are still applied using the usual order of operations of arithmetic: we do all multiplication and division steps before any addition or subtraction steps, and multiplication and division steps are processed left to right.

Additionally, the division that we use is floor division such that 10 * 9 / 8 equals 11.  This guarantees the result is an integer.

Implement the clumsy function as defined above: given an integer N, it returns the clumsy factorial of N.

Example 1:

Input:4
Output: 7
Explanation: 7 = 4 * 3 / 2 + 1

Example 2:

Input:10
Output:12
Explanation:12 = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1

Note:

  1. 1 <= N <= 10000
  2. 2^31 <= answer <= 2^31 - 1 (The answer is guaranteed to fit within a 32-bit integer.)

題目大意

通常,正整數 n 的階乘是所有小於或等於 n 的正整數的乘積。例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1。相反,我們設計了一個笨階乘 clumsy:在整數的遞減序列中,我們以一個固定順序的操作符序列來依次替換原有的乘法操作符:乘法(*),除法(/),加法(+)和減法(-)。例如,clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1。然而,這些運算仍然使用通常的算術運算順序:我們在任何加、減步驟之前執行所有的乘法和除法步驟,並且按從左到右處理乘法和除法步驟。另外,我們使用的除法是地板除法(floor division),所以 10 * 9 / 8 等於 11。這保證結果是一個整數。實現上面定義的笨函數:給定一個整數 N,它返回 N 的笨階乘。

解題思路

  • 按照題意,由於本題沒有括號,所以先乘除後加減。4 個操作一組,先算乘法,再算除法,再算加法,最後算減法。減法也可以看成是加法,只是帶負號的加法。

參考代碼

package leetcode

func clumsy(N int) int {
	res, count, tmp, flag := 0, 1, N, true
	for i := N - 1; i > 0; i-- {
		count = count % 4
		switch count {
		case 1:
			tmp = tmp * i
		case 2:
			tmp = tmp / i
		case 3:
			res = res + tmp
			flag = true
			tmp = -1
			res = res + i
		case 0:
			flag = false
			tmp = tmp * (i)
		}
		count++
	}
	if !flag {
		res = res + tmp
	}
	return res
}