什么是两个数字x和y,使得x和y的阶乘和等于阶乘10

时间:2016-03-22 03:59:59

标签: 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;
        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;
        }
    }

findFactorial是一个返回阶乘的函数。其定义如下

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;
        }
    }

3 个答案:

答案 0 :(得分:1)

现在,从数学上讲,n! > 2 x (n - 1)!代表所有n > 2。换句话说,不存在来自[1..9]的一对数字,使得阶乘的总和等于10阶乘。没有解决方案。

您的代码存在的问题是break仅在您获得问题的解决方案时才会被点击。

没有解决方案。

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

答案 1 :(得分:0)

正如C++ sum of two factorials euals factorial of 10 find two values say x and y whose factorials sums up中{0,1}对中唯一的解决方案所讨论的那样。

由于样本中的搜索以1开头,因此根本无法找到解决方案。所以while循环永远不会停止。请注意,在表达式c1! + i!中,c1最大值根本不受限制(与属于1-10范围的i不同)。这导致计算因子越来越大,直到StackOverflow发生在14000左右!

修复 - 在c1为10时将两个值都启动并停止迭代,或者使用嵌套for循环0-10而不是while(found)

请注意,由于整数计算的溢出行为,可以尝试使用显示的代码来计算像100!这样的大数的阶乘(也会在Why computing factorial of realtively small numbers (34+) returns 0中返回0),直到得到堆栈溢出的递归代码非常大(约14000!对我而言)数字。

答案 2 :(得分:-4)

你的问题是你正在递归地执行此操作,并且这对堆栈空间非常密集。我的建议是重写,所以它只是迭代;尽管递归地编写它在认知上更简单,但所有这些方法调用实际上都会加起来。如果它是一个赋值或什么的,你必须递归地执行它,添加一些堆栈空间。

How to change stack size for a .NET program?