📜  计算给定数字的MDAS阶乘

📅  最后修改于: 2021-05-04 18:37:16             🧑  作者: Mango

给定整数N ,任务是找到MDAS阶乘。

否的一般析因。 N由下式给出:

在MDAS阶乘中,不是简单地将数字从N乘以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)。

高效的方法:
如果我们仔细观察,可以得出以下结论:

  1. 如果N小于或等于2,则答案将是N本身。
  2. 如果N为3或N为4,则答案为N + 3。
  3. 如果(N – 4)可被4整除,则答案为N + 1。
  4. 如果(N – 4)在除以4时得到余数1或2,则答案为N + 2。
  5. 对于其余值,答案将为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)