我必须返回两个因子总和等于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;
}
}
答案 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)
你的问题是你正在递归地执行此操作,并且这对堆栈空间非常密集。我的建议是重写,所以它只是迭代;尽管递归地编写它在认知上更简单,但所有这些方法调用实际上都会加起来。如果它是一个赋值或什么的,你必须递归地执行它,添加一些堆栈空间。