Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个数x和y的阶乘和等于10的阶乘是什么_C# - Fatal编程技术网

C# 两个数x和y的阶乘和等于10的阶乘是什么

C# 两个数x和y的阶乘和等于10的阶乘是什么,c#,C#,我必须返回两个阶乘和等于10的数!。应在数组中返回两个数字。我已经做了如下代码,但它找不到任何这两个数字。它以“堆栈溢出异常”结束。 我的代码是: private int[] solve10() { int[] n = new int[2]; bool found=false; int c1 = 1; int fact1 = 0; int fact2 = 0; int fact10 = 0;

我必须返回两个阶乘和等于10的数!。应在数组中返回两个数字。我已经做了如下代码,但它找不到任何这两个数字。它以“堆栈溢出异常”结束。 我的代码是:

private int[] solve10()
    {
        int[] n = new int[2];
        bool found=false;
        int c1 = 1;
        int fact1 = 0;
        int fact2 = 0;
        int fact10 = 0;
        try
        {
            fact10 = findFactorial(10);
          while(!found)
            {
                fact1 = findFactorial(c1);
                for (int j = 1; j < 10;j++)
                {
                    fact2 = findFactorial(j);
                    if (fact1+fact2==fact10)
                    {
                        n[0] = c1;
                        n[1] = j;
                        found = true;
                        break;
                    }

                }
                c1++;
            }
            return n;
        }
        catch (Exception ex)
        {                
            throw ex;
        }
    }

你的问题是你在递归地做这件事,这对堆栈空间来说是非常密集的。我的建议是重写,这样它只是迭代;尽管递归地编写它在认知上更简单,但所有这些方法调用实际上是相加的。如果是为了一个赋值或其他什么,而你必须递归地执行它,那么添加一些堆栈空间

如{0,1}对中的唯一解决方案所述

由于示例中的搜索以1开头,因此根本无法找到解决方案。所以
循环从未停止过。请注意,在表达式
c1!+我
最大值不受任何限制(不同于属于1-10范围的
i
)。这导致计算越来越大的数字的阶乘,直到大约14000!发生堆栈溢出

修复-当
c1
为10时,以0开始两个值并停止迭代,或者将
嵌套为
循环0-10,而不是
while(found)



注意,由于整数计算的溢出行为,可以尝试计算大数的阶乘,如
100显示代码(也将返回0,如中所示),直到递归代码在非常大的(对我来说大约14000!个)数字上出现堆栈溢出。

现在,从数学上讲也是
n!>2x(n-1)用于所有
n>2
。换句话说,不存在一对来自
[1..9]
的数字,因此阶乘之和等于10阶乘。没有解决办法

代码的问题在于,只有当您找到问题的解决方案时,
中断才会出现

没有解决办法


因此,您的代码将继续
,而
将永远循环,递增
c1
,直到调用
findFactorial(c1)
导致堆栈溢出。

这在前面讨论过,更有趣的是答案中的
第3点
。为什么在那里有
try
/
catch
块?您希望它抛出什么异常,您可以从中恢复?我没有注意到,但您在这两个方面都有一个
try
/
catch
。这就是您编写所有代码的方式吗?这是一个不好的做法。现在,从数学角度来说也是
n!>2x(n-1)用于所有
n>2
。换句话说,不存在一对来自
[1..9]
的数字,因此阶乘和等于10阶乘。没有解决办法。为什么试抓不是好的做法。是的,在我上面的代码中可能不需要try-catch,但是我认为在一些异常情况下使用try/catch是很好的。对于我的问题,我认为你是对的,没有解决方案。如果有任何解决方案,那么我确信我的代码应该给出答案。我只想确认是否有错误,是否有这样的数字的阶乘和等于10!。谢谢。你真的相信10个递归调用会导致堆栈溢出吗?你有其他假设吗?不,我不需要假设-我知道答案。:)然后把它寄出去?我很好奇
private int findFactorial(int n)
    {
        int fact = 0;
        try
        {
            if(n==0 || n==1)
            {
              fact= 1;
            }
            else
            {
                fact= n * findFactorial(n - 1);
            }
            return fact;
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }