给定整数N ,任务是找到MDAS阶乘。
否的一般析因。 N由下式给出:
Factorial(N) = (N)*(N-1)*(N-2)*(N-3)*(N-4)*(N-5)*(N-6)*(N-7)- – – – – -(3)*(2)*(1).
在MDAS阶乘中,不是简单地将数字从N乘以1,而是以重复模式执行四个运算,即乘法(*),除法(/),加法(+)和减法(-),如下所示:
MDAS_Factorial(N) = (N) * (N-1) / (N-2) + (N-3) – (N-4) – – – – – upto 1.
通过以降序使用整数,我们将乘法运算交换为固定的旋转操作:按上述顺序乘(*),除(/),加(+)和减(-)。
例子:
Input : N = 4
Output : 7
Explanation : MDAS_Factorial(4) = 4 * 3 / 2 + 1 = 7
Input : N = 10
Output : 12
Explanation :
MDAS_Factorial(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1 = 12
简单方法::想法是为每个操作周期(*,/,+,-)使用一个循环,并计算N的MDAS_Factorial。但是,如果N非常大,这可能会很慢。这种方法的时间复杂度为O(N)。
高效的方法:
如果我们仔细观察,可以得出以下结论:
- 如果N小于或等于2,则答案将是N本身。
- 如果N为3或N为4,则答案为N + 3。
- 如果(N – 4)可被4整除,则答案为N + 1。
- 如果(N – 4)在除以4时得到余数1或2,则答案为N + 2。
- 对于其余值,答案将为N – 1。
下面是上述方法的实现
C++
// C++ Program to find MDAS_Factorial
#include
using namespace std;
// Program to find MDAS_factorial
int MDAS_Factorial(int N)
{
if (N <= 2)
return N;
if (N <= 4)
return (N + 3);
if ((N - 4) % 4 == 0)
return (N + 1);
else if ((N - 4) % 4 <= 2)
return (N + 2);
else
return (N - 1);
}
// Driver code
int main()
{
int N = 4;
cout << MDAS_Factorial(N) << endl;
N = 10;
cout << MDAS_Factorial(N) << endl;
return 0;
}
Java
// Java program find MDAS_Factorial
import java.util.*;
class Count {
public static int MDAS_Factorial(int N)
{
if (N <= 2)
return N;
if (N <= 4)
return (N + 3);
if ((N - 4) % 4 == 0)
return (N + 1);
else if ((N - 4) % 4 <= 2)
return (N + 2);
else
return (N - 1);
}
public static void main(String[] args)
{
int N = 4;
System.out.println(MDAS_Factorial(N));
N = 10;
System.out.println(MDAS_Factorial(N));
}
}
Python3
# Python3 code find MDAS_Factorial
def MDAS_Factorial( N ):
if N <= 2:
return N
if N <= 4:
return N + 3
if (N - 4) % 4 == 0:
return N + 1
elif (N - 4) % 4 <= 2:
return N + 2
else:
return N - 1
# Driver code
N = 4
print(MDAS_Factorial( N ) )
N = 10
print(MDAS_Factorial( N ) )
C#
// C# program to find MDAS_Factorial
using System;
class Count {
public static int MDAS_Factorial(int N)
{
if (N <= 2)
return N;
if (N <= 4)
return (N + 3);
if ((N - 4) % 4 == 0)
return (N + 1);
else if ((N - 4) % 4 <= 2)
return (N + 2);
else
return (N - 1);
}
// Driver code
public static void Main()
{
int N = 4;
Console.WriteLine(MDAS_Factorial(N));
N = 10;
Console.WriteLine(MDAS_Factorial(N));
}
}
PHP
输出 :
7
12
时间复杂度: O(1)
辅助空间: O(1)