笨阶乘

[leecode] 1006. 笨阶乘
问题
试图解题
地板除法(floor division)
思路和代码
问题
通常,正整数 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 的笨阶乘。

示例 1:

输入:4
输出:7
解释:7 = 4 * 3 / 2 + 1

示例 2:

输入:10
输出:12
解释:12 = 10 * 9 / 8 + 7 – 6 * 5 / 4 + 3 – 2 * 1

提示:

1 <= N <= 10000
-2^31 <= answer <= 2^31 – 1 (答案保证符合 32 位整数。)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/clumsy-factorial
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

试图解题
地板除法(floor division)
百科
python里的地板除

也就是截取商的整数位

思路和代码
俺寻思这应该就是写个计算器吧, 输入数值和运算规律固定的那种(掏出堆栈)
一开始把减号后面的那一个数也当成前一个入栈值的一部分了((N * (N – 1) / (N – 2)) – N + 3), 我是傻逼=。=
但是很申必, 放leecode上输入是4的时候能通过, 为什么输入10的时候就炸了, 明明在本地运行都没问题啊?
*稿代码:

class Solution {
public:
int clumsy(int N) {
int sum = 0;
int i = 0;
int* nums = new int[N % 4 ? N / 4 + 1 : N];
while (N / 4)
{
nums[i++] = (N * (N – 1) / (N – 2));
nums[i++] = N – 3;
N -= 4;
}
if (N)
{
switch (N)
{
case 3:
nums[i] = 6;
break;
case 2:
nums[i] = 2;
break;
case 1:
nums[i] = 1;
break;
default:
break;
}
i++;
}
i–;
while (i)
{
sum += i % 2 ? nums[i] : -nums[i];
i–;
}
return nums[0] + sum;
}
};

为啥运行了要炸啊?
嗯, i *大是N的2倍(取四舍五入),等会, 之前改i的逻辑的时候数组new的大小是不是忘记改了?!
草!果然! vs2019! 你算计我!!!
所以实际上数组大小是[N % 4 ? N / 2 + 1 : N * 2]
*终通过的代码如下:

class Solution {
public:
int clumsy(int N) {
int sum = 0;
int i = 0;
int* nums = new int[N % 4 ? N / 2 + 1 : N * 2];
while (N / 4)
{
nums[i++] = (N * (N – 1) / (N – 2));
nums[i++] = N – 3;
N -= 4;
}
if (N)
{
switch (N)
{
case 3:
nums[i] = 6;
break;
case 2:
nums[i] = 2;
break;
case 1:
nums[i] = 1;
break;
default:
break;
}
i++;
}
i–;
while (i)
{
sum += i % 2 ? nums[i] : -nums[i];
i–;
}
return nums[0] + sum;
}
};