C# 我试图找到一个多因子的值。两个值都将除以100/98! =?

C# 我试图找到一个多因子的值。两个值都将除以100/98! =?,c#,C#,你尝试的解决方案太复杂了,我不知道从哪里开始。当您不停下来思考如何手动解决此问题时,通常会发生这种情况: 所以,问题是,什么是5/3!?好的,让我们把它写出来: static void Main(string[] args) { Console.WriteLine("Enter your number: "); int number= Convert.ToInt32(Console.ReadLine()); int number2

你尝试的解决方案太复杂了,我不知道从哪里开始。当您不停下来思考如何手动解决此问题时,通常会发生这种情况:

所以,问题是,什么是
5/3!?好的,让我们把它写出来:

    static void Main(string[] args)
    {
        Console.WriteLine("Enter your number: ");
        int number= Convert.ToInt32(Console.ReadLine());
        int number2 = Convert.ToInt32(Console.ReadLine());

        double factorial = Factorial(number,number2);

        Console.WriteLine("Factorial of " + number +" / "+ number2 + " = " + factorial );

        Console.ReadKey();
    }

    //Factorial function added
    public static double Factorial(int number, int number2)
    {
        if (number == 1 && number2 ==1 )
        {
            return 1;
        }
        double factorial = 1;
        double factorial1 = 1;
        double factorial2 = 1;
        for (int i = number, j = number2; i >= 1 && j >= 1; i--, j--)
        {
            factorial1 = (factorial * i);
            factorial2 = (factorial * j);
            factorial = factorial1 / factorial2;

        }
        return factorial;

    }
哇,看起来可以简化为
5*4

这里的关键观点是
m!%n!=0
如果
n
小于或等于
m
。换句话说,
m总是可以被
n整除r
,这样
r*n!=m,您不需要计算
m
n
要了解
r
是什么,只需执行以下操作:

(5 * 4 * 3 * 2 * 1) / (3 * 2 * 1)
如果
n>m
r
为零,除非您正在寻找实数解,在这种情况下,您只需将
r
计算为
n!/m
然后返回
1.0/r
,因为
m!/n=
1/(n!/m!)

如何评估
r

r = m * (m - 1) * (m - 2) * ... * (n + 1); // m >= n
或实数解:

public static long DivideFactorials(int m, int n)
{
     if (n > m)
         return 0;

     var r = 1L;

     for (var k = m; k > n; k--)
         r *= k;

     return r;
}

如果我必须保存您的尝试:

public static double DivideFactorials(int m, int n)
{
     if (n > m)
         return 1 / DivideFactorials(n, m);

     var r = 1.0;

     for (var k = m; k > n; k--)
         r *= k;

     return r;
}
N!/啊带有
N>O

 let N=3, O=3
 N! = 1*2*3
 O! = 1*2*3
 N! / O! = 1*2*3/(1*2*3) == 1
N!/啊
N

 let N=5, O=3
 N! = 1*2*3*4*5
 O! = 1*2*3
 N! / O! == 1*2*3*4*5/(1*2*3) == 4*5 == 20
基于此,我将对问题进行如下建模:

 let N=3, O=5
 N! = 1*2*3
 O! = 1*2*3*4*5
 N! / O! == 1*2*3/(1*2*3*4*5) == 1/(4*5) == 1/20

提示,您不需要计算阶乘(如果有)。在一张纸上写下
5/3!并找出原因…所以。。。你有什么问题?真正的问题是什么?你所拥有的只是代码。请编辑您的问题以使其更具体。我面临的问题是,在执行此代码后,没有提交正确的答案。。数字2没有得到我想要的正确值。除以两个像100这样的阶乘数/98! =9900但输出不正确,为什么?2个不同的更容易理解-而且两者都更容易摸索,然后我的+1太好了。最后一个是工作,所以很容易理解!!!但是,如果我想m>n比?@IqramHasanRabbi这两种解决方案已经为所有情况给出了答案
m>n
m==n
m
。在ur CALC ACT分区中给出错误。这就是为什么这段代码没有运行。@IqramHasanRabbi我的代码按原样运行。否则它将如何管理输出?如果它给您一个错误,您可能没有100%地复制或以某种方式修改它。错误说明了什么?
 let N=3, O=5
 N! = 1*2*3
 O! = 1*2*3*4*5
 N! / O! == 1*2*3/(1*2*3*4*5) == 1/(4*5) == 1/20
using System;
using System.Collections.Generic;
using System.Linq;

internal class Program
{
    public static decimal CalcFactDivision(int n1, int n2)
    {
        // calclulate the division of a factorial by another, num1 must be >= num2
        IEnumerable<int> getRemaining(int num1, int num2)
        {
            // special cases: div by 0 and 0 div something
            if (num2 == 0)
                num2 = 1; // 0! == 1
            else if (num1 == 0)
                return new[] { 0 };

            // get all numbers that make up the factorial in one step 
            // I can guarantee that num1 will always be bigger then num2
            // by how I call this
            return Enumerable.Range(num2 + 1, num1 - num2);
        }

        // calculate the product of an ienumerable of ints
        int product(IEnumerable<int> nums) => nums.Aggregate((a, b) => a * b);

        if (n1 == n2)
            return 1;
        else if (n1 > n2) // use product(...) to calc
            return product(getRemaining(n1, n2));
        else // flip them and use 1/product(...) to calc
            return (decimal)1 / product(getRemaining(n2, n1));
    }

    static void Main(string[] args)
    {
        foreach (var a in Enumerable.Range(1, 10))
            Console.WriteLine($"{a}! / {10 - a}! = {CalcFactDivision(a, 10 - a)} ");

        Console.ReadLine();
    }
}
1! / 9! = 0,0000027557319223985890652557
2! / 8! = 0,0000496031746031746031746032
3! / 7! = 0,0011904761904761904761904762
4! / 6! = 0,0333333333333333333333333333
5! / 5! = 1
6! / 4! = 30
7! / 3! = 840
8! / 2! = 20160
9! / 1! = 362880
10! / 0! = 3628800